我知道我不能修改 EJB 容器中的线程,因此我不知道如何在 EJB 环境中以正确的方式执行以下操作:
涉及的有:
- 无状态会话 Bean“客户端”
- 无状态会话 Bean“服务器”
- 消息队列“队列”
- 消息驱动 Bean“Mdb”处理来自“队列”的消息
- n 无状态会话 Bean W1 到 Wn
场景是:
Client调用一个方法Server,它又发送几条消息到Queue。在那之后,Server做一些其他的事情。同时,Mdb消费一条消息,调用Wi它做了一些相当长的计算,并得到结果。现在Mdb将结果给出Server. When Server获取其发送的每条消息的所有“结果”,它对来自的结果进行更多计算Ws,并将结果返回到Client.
我的问题:
在 Java SE 中,我只需执行 .wait() 即可Server等待结果Ws,之后Server发送消息后完成工作。然后mdb当它设置结果时会 .notify() 。正如规范所述,由于我不能在 EJB 容器中修改线程,因此我迷失了方向,因为我没有找到任何适当的方法来在 EJB 环境中实现相同的行为。
任何有关该问题的帮助将不胜感激,提前致谢。
P.S.:我正在使用 JBoss 5.1.0,以防有任何特定于供应商的措施来解决该问题。
对此的适当解决方案是消息传递的“请求/响应”模式。简而言之,您可以通过消息传递系统通过发送消息并等待响应消息来执行“同步”操作(所有这些在 J2EE 世界中都是合法的)。在实践中,您可以通过多种方式实现此目的,但一般的想法是,您发送带有某种唯一标识符的请求消息,然后使用为您指定的请求 ID 设置的消息过滤器来等待响应消息。已发送(这通常是“correlationId”字段 http://docs.oracle.com/javaee/5/api/javax/jms/Message.html#setJMSCorrelationID%28java.lang.String%29是用来)。 MDB 将获取请求消息,处理它们,并使用请求消息中指定的唯一标识符发送响应消息。你可以用一个队列来完成所有这些,或者你可以使用单独的请求/响应队列,或者你可以做一些疯狂的事情,比如创建“临时”响应队列 http://docs.oracle.com/javaee/5/api/javax/jms/QueueSession.html#createTemporaryQueue%28%29(每个请求)。您可以使用以下命令告诉 MDB 将请求消息发送到哪里Message.setJMSReplyTo http://docs.oracle.com/javaee/5/api/javax/jms/Message.html#setJMSReplyTo%28javax.jms.Destination%29 method.
一般模式是:
- 客户端调用服务器
- server:
- 创建消息,设置correlationId和replyTo
- 创建QueueSender,发送消息
- mdb (repeat for each message):
- 收到消息
- 处理消息
- 发送带有correlationId的响应消息
- server:
- 使用correlationId创建消息过滤器
- 使用消息选择器创建 QueueReceiver
- calls
receive()
直到所有消息都被接收并处理(或超时)
- 进行最终处理,响应客户端
(显然,服务器直接从步骤2进行到步骤4,我这样写只是为了突出控制流程。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)