繁体   English   中英

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

[英]Is there something that behaves like .wait() and .notify() in EJB environment?

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

涉及的是

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

场景是

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

我的问题

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

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

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

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

一般模式是:

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

(显然,服务器直接从第2步到第4步,我只是用这种方式写它来突出控制流程。)

什么对象充当MDB返回所有消息的服务器? 它可能需要某种CountDownLatch来等待,消息数量的大小(由MDB改变直到达到零)。 当它变为零时,它将唤醒可以运行返回客户端的代码。 请参阅CountDownLatch的API文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM