Java EE容器中的同步请求 - 回复模式

时间:2013-08-31 02:24:39

标签: jms mq

我希望在Java EE容器中使用JMS实现同步请求 - 回复模式。序列将是这样的

  1. 浏览器向Web应用程序发出数据请求。这是阻止请求(比如在线程T1上)。
  2. 网络应用需要连接到远程网络服务才能完成上述请求。因此它形成一个请求并将其放在队列中(同时声明了一个回复队列)。
  3. 远程服务处理请求并将响应放在步骤2中声明的回复队列
  4. 响应从Web应用程序中的回复Q中读取,并可用于步骤1的阻止线程T1。
  5. 我已经按照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模块)中运行可能有多个并发请求进入时,上述解决方案是否有效?

2 个答案:

答案 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