我想编写一个处理XMPP上的通信流的方法。我想做的事情是:
由于我们可以等待超过30秒的响应(步骤2),我将开始一项任务来处理这个问题。此任务需要发送消息,然后等待处理传入消息的XMPP servlet上的响应。我的问题是:如何在任务servlet线程中等待响应到达XMPP Servlet?
我通常使用一个侦听器模式,其中侦听器将消息存储在Task对象的字段中,然后触发信号量以指示消息已到达。像这样:
我试过这个,它在开发服务器上运行良好。但是,当我上传到云时,我发现我将在XMPP servlet上安装监听器(步骤1),但是当消息进入时,将会实例化一个新的servlet实例,并且不会再引用监听器通过监听器调用,是一个静态字段。我的结论是XMPPServlet在一个完全不同的VM中运行,这意味着静态字段不在该servlet和任务之间共享。这是对的吗?
一般来说,这些servlet之间通信的最佳实践是什么?如何共享数据(通常我会将其存储在对象的字段中)以及当事件发生时我如何从一个信号发送到另一个(通常我会使用信号量)?
对这个冗长的问题感到抱歉。告诉我,如果它不清楚,我会稍微改进一下。
答案 0 :(得分:2)
将我的答案重新发送到您在邮件列表中提出的相同问题:
您不能[等待发送过程中的响应]。相反,你 应该使用异步模式:发送消息,并注册一个 传入XMPP消息的处理程序。那个处理程序应该匹配 响应相应的请求(存储在数据存储区中,如果 必要的)并对其进行适当的处理。
App Engine应用程序可以在任意数量的计算机上运行; 设计用于线程之间通信的同步原语 不行。