我想写一个方法来处理XMPP上的通信流。我想要做的事情的顺序是:Servlets之间的通信
- 发送消息。
- 等待回复。
- 处理响应。
既然我们能比30岁的响应(步骤2)我会发球了一个任务来照顾这等待更长的时间。此任务需要发送消息,然后等待处理传入消息的XMPP servlet上的响应。我的问题是:如何在任务servlet线程中等待响应到达XMPP Servlet?
我通常会使用侦听器模式,其中侦听器将消息存储在Task对象的某个字段中,然后触发一个Semaphore来指示消息已到达。像这样:
- 在静态字段中将侦听器安装在XMPP servlet中。
- 发送信息。
- 等待信号量。 ........ 同时,在XMPP servlet线程中,响应将到达,它将调用监听器的回调方法,该方法存储消息并释放信号量。
- 从现场和过程中获取消息。
我试过了,它在开发服务器上工作正常。然而,当我上传到云中时,我发现我将监听器安装在XMPP servlet上(步骤1),但是当消息进入时,将会实例化一个新的servlet实例,并且不再有对监听器来调用,通过监听器的事件是一个静态字段。我的结论是XMPPServlet运行在一个完全不同的VM中,这意味着静态字段不会在该servlet和任务之间共享。它是否正确?
一般来说,这些servlet之间通信的最佳实践是什么?如何共享数据(通常我会将它存储在对象的字段中)以及当事件发生时(通常我会使用信号量),如何从一个信号发送到另一个信号?
对不起,关于冗长的问题。告诉我,如果不清楚,我会稍微改进一下。
感谢您的回复。当你说“处理程序应该匹配相应的请求(必要时存储在数据存储区中)”时,除数据存储库外还有其他方法吗?了解人们是如何做到这一点的,以及最佳做法是什么...... –
@MarkSilberbauer取决于你的信息是什么,以及你需要什么背景。您可以在请求中发送ID或其他信息,并在回复中要求回传。如果您需要带外上下文,Datastore就是这样。 –