我希望在Java EE容器中使用JMS实现同步请求 - 回复模式。序列将是这样的
我已经按照T.Rob(How to match MQ Server reply messages to the correct request)
提供的答案QueueReceiver queueReceiver =
session.createReceiver(destination, "JMSCorrelationID='customMessageId'");
TextMessage receivedMessage = (TextMessage)queueReceiver.receive( 15000 );
在Java EE容器(Web模块)中运行可能有多个并发请求进入时,上述解决方案是否有效?
答案 0 :(得分:2)
这取决于对“有效”的看法:它可能会编译和工作。但从设计的角度来看,人们可以说你可以真正改进它。
如果您的主题阻止,则任何异步通信都不会添加任何值。相反,它会使它变慢,它会消耗资源,甚至可能造成麻烦(见下面的链接)。
处理消息的系统(可能是MDB)公开了什么服务,将其提取到一个单独的服务类中,并以无状态会话bean的形式提供另一个前端。因此,您的服务通过同步和异步接口公开,客户端可以选择。
在您的场景中,您的servlet只是同步调用EJB。
至于可能发生的问题:看看JMS request/response pattern in transactional environment(这种方法使用临时队列)。
使用单个队列(您在问题中引用的方式),您需要一个选择器(条件)来获取相关消息:此可能很慢,具体取决于队列中的卷
另一方面,如果您使用异步支持实现 servlet (使用@WebServlet(asyncSupported = true)
),则会有所不同。在那种情况下,我会说这是一种有效的方法。
在这种情况下,您可以节省资源(即线程;但HTTP连接保持打开状态),因为侦听队列的一个后台线程可以为多个客户端提供服务。如果您遇到性能或资源问题,请考虑这一点。在那之前,我建议使用同步方式,因为它更容易实现。
答案 1 :(得分:0)
EAI模式的 JMS请求/回复可能适合您。
它得到了很好的解释,并且还有Java样本:
http://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReplyJmsExample.html