Jms JavaEE容器中的同步请求-应答模式

Jms JavaEE容器中的同步请求-应答模式,jms,mq,Jms,Mq,我希望在JavaEE容器中使用JMS实现同步请求-应答模式。序列应该是这样的 浏览器向web应用程序发出数据请求。这是一个阻塞请求(比如在线程T1上) web应用程序需要连接到远程web服务以满足上述请求。因此,它形成一个请求并将其放在一个队列中(还声明了对队列的回复) 远程服务处理请求,并将响应放在步骤2中声明的回复队列上 响应从web应用程序中的回复Q中读取,并提供给步骤1的阻塞线程T1 我遵循了T.Rob()提供的答案 QueueReceiver队列接收器= createReceiver(

我希望在JavaEE容器中使用JMS实现同步请求-应答模式。序列应该是这样的

  • 浏览器向web应用程序发出数据请求。这是一个阻塞请求(比如在线程T1上)
  • web应用程序需要连接到远程web服务以满足上述请求。因此,它形成一个请求并将其放在一个队列中(还声明了对队列的回复)
  • 远程服务处理请求,并将响应放在步骤2中声明的回复队列上
  • 响应从web应用程序中的回复Q中读取,并提供给步骤1的阻塞线程T1
  • 我遵循了T.Rob()提供的答案

    QueueReceiver队列接收器=
    createReceiver(目标,“JMSCorrelationID='customMessageId');
    TextMessage receivedMessage=(TextMessage)queueReceiver.receive(15000);
    

    上述解决方案在Java EE容器(web模块)中运行时有效吗?可能有多个并发请求传入?

    这取决于对“有效”的理解:它可能会编译并工作。但是从设计的角度来看,你可以说你真的可以改进它


    如果线程被阻塞,任何异步通信都不会增加任何价值。相反,它会使速度变慢,消耗资源,甚至可能造成麻烦(请参阅下面的链接)

    处理消息的系统(可能是MDB)公开的任何服务,将其提取到单独的服务类中,并以无状态会话bean的形式提供另一个前端。因此,您的服务通过同步和异步接口公开,客户机可以选择

    在您的场景中,servlet只是同步调用EJB

    至于可能发生的其他问题:看一看(这种方法使用临时队列)

    使用单个队列(您在问题中引用的方式),您需要一个选择器(条件)来获取相关消息:这可能会很慢,具体取决于队列中的容量


    另一方面,如果您也使用异步支持来实现您的servlet(使用
    @WebServlet(asyncSupported=true)
    ),则情况有所不同。在这种情况下,我会说这是一种有效的方法


    在这种情况下,您可以节省资源(即线程;但HTTP连接保持打开状态),因为一个侦听队列的后台线程可以为多个客户端服务。如果有性能或资源问题,请考虑这一点。在此之前,我建议使用同步方式,因为它更容易实现。

    EAI模式的JMS请求/回复可能适合您

    这里有很好的解释,还有Java中的示例:


    远程服务是如何实现的:独立队列接收器、MDB、另一个系统等?远程服务是作为MDB实现的,它侦听预定义队列上的请求。