【问题标题】:Message driven bean not responding until client method is complete在客户端方法完成之前,消息驱动的 bean 没有响应
【发布时间】:2010-04-27 08:15:19
【问题描述】:

我有一个部署在 Jboss 4.2.2 上的 MDB 和一个客户端在同一台服务器上,它产生消息并期望通过在发送消息之前创建的临时队列从 MDB 得到回复。

当我运行客户端时,我看到它创建了消息,将它放入队列并等待回复(到目前为止没有问题)......但是当我检查日志时,我看到超时并且没有收到任何回复。当超时发生并且客户端的方法完成时,MDB 开始处理在客户端将消息放入队列时应该已处理的消息。由于这个时间问题,当 MDB 尝试回复临时队列时,它会失败,因为客户端已经离开。

如果我从远程服务器运行相同的客户端,我没有问题... MDB 立即从队列中提取消息,并且客户端在处理完成后立即收到其响应。

我正在使用容器管理的事务。我怀疑它与此有关......我认为客户端的“发送消息/接收回复”在提交将消息放入队列之前可能都被视为事务......但我不确定是否这是对的。如果是这种情况,为什么我没有从远程客户端看到相同的行为?客户端管理的事务是默认设置吗?这就是我的远程服务器使用的?

知道如何解决这个问题吗?

提前致谢! PJ

【问题讨论】:

    标签: jboss transactions jms jboss-mdb


    【解决方案1】:

    听起来这里有两个问题。第一个是请求消息在发送时没有被提交,并且可能与接收调用在同一个工作单元中。正如您所指出的,这里的关键是确定远程时行为发生变化的原因。或者,显式提交发送的消息。

    第二个问题是,一旦达到超时,消息最终会提交。解决第一个问题将把它变成一个潜在的问题,看起来已经解决了,但稍后会回来咬你。行为可能会有所不同,具体取决于传输提供者是否认为这是一个例外。理想情况下,超时被视为异常并且事务回滚。假设您能够处理请求消息的发送,唯一需要超时的事务是接收回复 - 您绝对希望在超时后导致提交或其他例外。

    抱歉,我没有更明确的答案。将您的接受留给那些确实注意接收交易边界的人。

    【讨论】:

    • 您好,感谢您的回复。为了简化我的解释,我省略了我现在看到的相关细节。客户端在本地运行时从 EJB 3.0 运行。我创建了一个远程接口,我可以从一个简单的命令行应用程序访问该接口,然后 EJB 将消息发送到队列。当我放置 session.commit 时,我得到一个异常,指出它不能在 XASession 中使用。也许我不能在 EJB 中使用事务?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多