gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:58:38 25 4
gpt4 key购买 nike

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

  1. 浏览器向网络应用程序发出数据请求。这是一个阻塞请求(比如在线程 T1 上)。
  2. 网络应用需要连接到远程网络服务才能完成上述请求。因此它形成一个请求并将其放入一个队列(同时声明了一个回复队列)。
  3. 远程服务处理请求并将响应放入步骤 2 中声明的回复队列
  4. 从网络应用中的回复 Q 中读取响应,并提供给步骤 1 的阻塞线程 T1。

我已经按照 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 模块)中运行时,上述解决方案是否有效?

最佳答案

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


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

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

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

至于否则可能出现的问题:看JMS request/response pattern in transactional environment (此方法使用临时队列)。

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


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

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

关于jms - Java EE 容器中的同步请求-回复模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com