Servlet之间的通信

时间:2011-10-05 05:12:06

标签: java google-app-engine

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

  1. 发送消息。
  2. 等待回复。
  3. 处理回复。
  4. 由于我们可以等待超过30秒的响应(步骤2),我将开始一项任务来处理这个问题。此任务需要发送消息,然后等待处理传入消息的XMPP servlet上的响应。我的问题是:如何在任务servlet线程中等待响应到达XMPP Servlet?

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

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

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

      对这个冗长的问题感到抱歉。告诉我,如果它不清楚,我会稍微改进一下。

1 个答案:

答案 0 :(得分:2)

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

  

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

     

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