我知道我不能修改EJB容器中的线程,因此我不知道如何以正确的方式在EJB环境中执行以下操作:
参与:
情景:
客户端调用服务器的方法,该方法又将多个消息发送到队列。之后,服务器会做其他一些事情。在此期间, Mdb 会消耗一条消息,调用 Wi 进行一些相当长的计算,然后得到结果。现在 Mdb 将结果提供给 Server 。当服务器获取其发送的每条消息的所有“结果”时,它会使用 W 的结果进行更多计算,并将结果返回给客户端
我的问题:
在Java SE中,我只需要.wait()让 Server 等待 W 的结果,在 Server 之后发送消息后的工作。然后 mdb 在设置结果时会.notify()。因为我不能修改EJB容器中的线程,正如规范所述,我迷失了因为我没有找到任何适当的方法在EJB环境中实现相同的行为。
提前感谢,对此问题的任何帮助都会非常感激。
P.S。:我正在使用JBoss 5.1.0,以防有任何特定于供应商的措施来解决这个问题。
答案 0 :(得分:4)
适当的解决方案是用于消息传递的“请求/响应”模式。简而言之,您可以通过发送消息并等待响应消息来通过消息传递系统执行“同步”操作(所有这些在J2EE世界中都是合法的)。有多种方法可以在实践中实现这一点,但一般的想法是你发送带有某种唯一标识符的请求消息,然后使用为你的请求ID设置的消息过滤器等待响应消息已发送(这通常是"correlationId" field用于)。 MDB将获取请求消息,处理它们,并使用请求消息中指定的唯一标识符发送响应消息。您可以使用一个队列执行所有这些操作,或者您可以使用单独的请求/响应队列,或者您可以执行创建"temporary" response queues(每个请求)等疯狂的操作。您可以使用Message.setJMSReplyTo
方法告诉MDB将请求消息发送到何处。
一般模式是:
receive()
,直到收到并处理(或超时)所有邮件(显然,服务器直接从第2步到第4步,我只是用这种方式写它来突出控制流程。)
答案 1 :(得分:-1)
哪个对象充当MDB返回所有消息的服务器?它可能需要某种CountDownLatch来等待,消息数量的大小(由MDB改变直到达到零)。当它变为零时,它将唤醒可以运行返回客户端的代码。 请参阅CountDownLatch的API文档。