gpt4 book ai didi

java - 在 EJB 环境中是否存在类似于 .wait() 和 .notify() 的行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:46 24 4
gpt4 key购买 nike

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

涉及:

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

场景是:

客户端 调用服务器 的方法,后者又将多个消息发送到队列。之后,Server 会做一些其他的事情。与此同时,Mdb 消费一条消息,调用 Wi 进行一些相当长的计算,并获得结果。现在 Mdb 将结果提供给 Server。当 Server 获得了它发送的每条消息的所有“结果”时,它会对来自 W 的结果进行更多计算,并将该结果返回给 Client .

我的问题:

在 Java SE 中,我会简单地执行 .wait() 让 ServerServer 完成后等待 W 的结果发送消息后的工作。然后 mdb 将在设置结果时调用 .notify()。由于我不能在 EJB 容器中修改线程,正如规范所述,我迷路了,因为我没有找到任何合适的方法来在 EJB 环境中实现相同的行为。

在此先感谢您对该问题的任何帮助。

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

最佳答案

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

一般模式是:

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

(很明显,服务器直接从第2步执行到第4步,我这样写是为了突出控制流程。)

关于java - 在 EJB 环境中是否存在类似于 .wait() 和 .notify() 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100987/

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