Java servlet之间的通信

Java servlet之间的通信,java,google-app-engine,Java,Google App Engine,我想写一个方法来处理XMPP上的通信流。我想做的事情的顺序是: 发送消息 等待回应 处理响应 因为我们可能需要等待30秒以上的响应(步骤2),所以我会安排一个任务来处理这个问题。此任务需要发送消息,然后等待处理传入消息的XMPPservlet上的响应。我的问题是:如何在任务servlet线程中等待响应到达XMPPservlet 我通常使用监听器模式,监听器将消息存储在任务对象的字段中,然后触发一个信号量来表示消息已经到达。像这样: 在静态字段中的XMPPservlet中安装侦听器 发送消息 等待

我想写一个方法来处理XMPP上的通信流。我想做的事情的顺序是:

  • 发送消息
  • 等待回应
  • 处理响应
  • 因为我们可能需要等待30秒以上的响应(步骤2),所以我会安排一个任务来处理这个问题。此任务需要发送消息,然后等待处理传入消息的XMPPservlet上的响应。我的问题是:如何在任务servlet线程中等待响应到达XMPPservlet

    我通常使用监听器模式,监听器将消息存储在任务对象的字段中,然后触发一个信号量来表示消息已经到达。像这样:

  • 在静态字段中的XMPPservlet中安装侦听器
  • 发送消息
  • 等待信号量。。。。。。。。同时,在XMPPservlet线程中,响应将到达,它将调用侦听器的回调方法,该方法存储消息并释放信号量
  • 从字段和进程获取消息
  • 我尝试了这个,它在开发服务器上运行得很好。然而,当我上传到云上时,我发现我将在XMPPservlet上安装侦听器(步骤1),但是当消息传入时,将实例化一个新的servlet实例,并且不再有对要调用的侦听器的引用,通过侦听器的事件是一个静态字段。我的结论是XMPPServlet在一个完全不同的VM中运行,这意味着该servlet和任务servlet之间不共享静态字段。这是正确的吗

    一般来说,这些servlet之间通信的最佳实践是什么?如何共享数据(通常我会将其存储在对象的字段中)以及在事件发生时如何从一个向另一个发送信号(通常我会使用信号量)


    对不起,这个冗长的问题。如果不清楚,请告诉我,我会将其细化一点。

    重新发布我对您在邮件列表中提出的相同问题的答案:

    您不能[在发送过程中等待响应]。相反,你 应该使用异步模式:发送消息并注册 传入XMPP消息的处理程序。该处理程序应该与 对相应请求的响应(如果需要,存储在数据存储中) (必要时)并对其进行适当处理

    应用程序引擎应用程序可以在任意数量的机器上运行; 为线程间通信而设计的同步原语 这是行不通的


    谢谢你的回复。当您说“处理程序应该匹配相应的请求(必要时存储在数据存储中)”时,除了数据存储之外还有其他方法吗?只是想了解人们是如何做到这一点的,以及最佳实践是什么…@MarkSilberbauer取决于你的信息是什么,以及你需要什么样的背景。您可以在请求中发送ID或其他信息,并在响应中要求返回。如果您需要带外上下文,数据存储就是其中之一。