我在Jboss 4.2.2上部署了一个MDB,并且在同一服务器上有一个客户端,它生成消息,并期望通过在发送消息之前创建的临时队列来回复MDB。
当我运行客户端时,我看到它创建了消息,将其放入队列并等待回复(到目前为止没问题)......但是当我检查日志时,我看到达到了超时并且没有收到任何回复。当超时发生且客户端的方法完成时,MDB开始处理客户端将其放入队列时应该处理的消息。由于这个计时问题,当MDB尝试回复临时队列时,它会因客户端已经消失而失败。
如果我从远程服务器运行相同的客户端,我没有问题...... MDB立即从队列中获取消息,客户端在处理完成后立即收到响应。
我正在使用容器管理的事务。我怀疑它与此有关...我认为客户端的“发送消息/接收回复”可能都被认为是一个事务,然后它才会将消息放入队列......但我不确定是否这是对的。如果是这种情况,为什么我从远程客户端看不到相同的行为?客户端管理事务是默认设置,这是我的远程服务器使用的吗?
知道如何解决这个问题吗?
提前致谢! PJ
答案 0 :(得分:1)
听起来这里有两个问题。第一个是请求消息在发送时没有被提交,并且可能与接收呼叫在同一工作单元中。如您所述,此处的关键是确定远程时行为发生变化的原因。或者,显式提交已发送的消息。
第二个问题是,一旦达到超时,消息最终会提交。解决第一个问题将把它变成一个潜在的问题,似乎已经修复但稍后再回来咬你。行为可能会有所不同,具体取决于传输提供商是否认为这是一个例外。理想情况下,超时被视为异常,事务将回退。假设您能够处理请求消息的发送,唯一受超时的事务是接收回复 - 您肯定不希望在超时后导致提交或其他例外。
抱歉,我没有更明确的答案。保留对接受的人的接受,但要注意收到的那些交易边界。