2011-10-05 59 views
0

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

  1. 发送消息。
  2. 等待回复。
  3. 处理响应。

既然我们能比30岁的响应(步骤2)我会发球了一个任务来照顾这等待更长的时间。此任务需要发送消息,然后等待处理传入消息的XMPP servlet上的响应。我的问题是:如何在任务servlet线程中等待响应到达XMPP Servlet?

我通常会使用侦听器模式,其中侦听器将消息存储在Task对象的某个字段中,然后触发一个Semaphore来指示消息已到达。像这样:

  1. 在静态字段中将侦听器安装在XMPP servlet中。
  2. 发送信息。
  3. 等待信号量。 ........ 同时,在XMPP servlet线程中,响应将到达,它将调用监听器的回调方法,该方法存储消息并释放信号量。
  4. 从现场和过程中获取消息。

我试过了,它在开发服务器上工作正常。然而,当我上传到云中时,我发现我将监听器安装在XMPP servlet上(步骤1),但是当消息进入时,将会实例化一个新的servlet实例,并且不再有对监听器来调用,通过监听器的事件是一个静态字段。我的结论是XMPPServlet运行在一个完全不同的VM中,这意味着静态字段不会在该servlet和任务之间共享。它是否正确?

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

对不起,关于冗长的问题。告诉我,如果不清楚,我会稍微改进一下。

回答

2

转贴我的回答对你问的邮件列表上的同一个问题:

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

App Engine应用程序可以在任意数量的机器上运行; 为线程 之间的通信而设计的同步原语将不起作用。

+0

感谢您的回复。当你说“处理程序应该匹配相应的请求(必要时存储在数据存储区中)”时,除数据存储库外还有其他方法吗?了解人们是如何做到这一点的,以及最佳做法是什么...... –

+0

@MarkSilberbauer取决于你的信息是什么,以及你需要什么背景。您可以在请求中发送ID或其他信息,并在回复中要求回传。如果您需要带外上下文,Datastore就是这样。 –