Java 处理JMS MessageConsumer.receive(长)在超时内未返回的问题

Java 处理JMS MessageConsumer.receive(长)在超时内未返回的问题,java,jms,activemq,Java,Jms,Activemq,MessageConsumer.receive(长)允许指定接收超时 然而,我发现,如果你让制作人离开(例如,通过终止进程),消费者的接收并不总是超时。事实上,有时它会永远等待,而过程永远不会退出 事实证明,我可以向连接中添加一个例外侦听器,但这有一些缺点: (1) 除了我试图执行的操作,我可能会在其他方面出错; (2) receive()本身仍然不一定完成; (3) 显然,我们以前使用了ExceptionListener,它导致了一些其他问题,我不知道这些问题的具体情况 一个对我们来说可行的潜

MessageConsumer.receive(长)
允许指定接收超时

然而,我发现,如果你让制作人离开(例如,通过终止进程),消费者的接收并不总是超时。事实上,有时它会永远等待,而过程永远不会退出

事实证明,我可以向连接中添加一个
例外侦听器
,但这有一些缺点: (1) 除了我试图执行的操作,我可能会在其他方面出错; (2) receive()本身仍然不一定完成; (3) 显然,我们以前使用了ExceptionListener,它导致了一些其他问题,我不知道这些问题的具体情况

一个对我们来说可行的潜在黑客(我们正在使用ActiveMQ)是,当暂停发生时,线程将处于wait()(这几乎肯定是特定于实现的,但似乎是一个常见的选择。)因此,如果出现异常,我们可以中断线程执行receive()调用


这是一个明智的解决方案吗?对于这个问题,是否有更可靠、更广为人知、更常用的解决方法?

您可以设置一个消息侦听器,而不是使用receive。这似乎是ActiveMQ中的一个bug,您在他们的JIRA中报告过它吗?

不,我没有。。。我不太确定这是一个bug来报告它,因为整个JMS API对于行为的所有细节都是如此含糊不清,以至于几乎任何东西都会被视为遵循记录的行为……在预期的时间内返回是由规范明确定义的。我强烈建议,如果您看到一个实现者没有遵循,那么就应该向他们提出错误。