在EJB环境中是否有类似.wait()和.notify()的东西?

Dan*_*iel 6 java multithreading ejb

我知道我不能修改EJB容器中的线程,因此我不知道如何在EJB环境中以正确的方式执行以下操作:

涉及的是:

  • 无状态会话Bean"客户端"
  • 无状态会话Bean"服务器"
  • MessageQueue"队列"
  • 消息驱动Bean"Mdb"处理来自"队列"的消息
  • n无状态会话Bean W1到Wn

场景是:

客户端调用服务器方法,然后将几个消息发送到队列.之后,Server会做其他一些事情.在此期间,Mdb消耗一条消息,调用Wi进行一些相当长的计算,并得到结果.现在Mdb将结果提供给Server.当服务器获取它发送的每条消息的所有"结果"时,它会使用W s 的结果进行更多计算,并将结果返回给客户端.

我的问题:

在Java SE,我只想做.wait()来让服务器等待的结果W¯¯年代,经过服务器没有发送消息后的工作.然后mdb在设置结果时会.notify().因为我不能修改EJB容器中的线程,正如规范所述,我迷失了因为我找不到任何适当的方法来在EJB环境中实现相同的行为.

对此问题的任何帮助都将非常感谢,提前感谢.

PS:我正在使用JBoss 5.1.0,以防有任何特定于供应商的措施来解决这个问题.

jta*_*orn 4

对此的适当解决方案是消息传递的“请求/响应”模式。简而言之,您可以通过消息传递系统通过发送消息并等待响应消息来执行“同步”操作(所有这些在 J2EE 世界中都是合法的)。在实践中,您可以通过多种方式实现此目的,但一般的想法是,您发送带有某种唯一标识符的请求消息,然后使用为您指定的请求 ID 设置的消息过滤器来等待响应消息。已发送(这通常是“correlationId”字段的用途)。MDB 将获取请求消息,处理它们,并使用请求消息中指定的唯一标识符发送响应消息。您可以使用一个队列完成所有这些操作,也可以使用单独的请求/响应队列,或者您可以做一些疯狂的事情,例如创建“临时”响应队列(每个请求)。您可以使用该方法告诉 MDB 将请求消息发送到哪里Message.setJMSReplyTo

一般模式是:

  1. 客户端调用服务器
  2. 服务器:
    1. 创建消息,设置correlationId和replyTo
    2. 创建QueueSender,发送消息
  3. mdb(对每条消息重复):
    1. 收到消息
    2. 处理消息
    3. 发送带有correlationId的响应消息
  4. 服务器:
    1. 使用correlationId创建消息过滤器
    2. 使用消息选择器创建 QueueReceiver
    3. 调用receive()直到接收并处理所有消息(或超时)
    4. 进行最终处理,响应客户端

(显然,服务器直接从步骤2进行到步骤4,我这样写只是为了突出控制流程。)