解决JMS MessageConsumer.receive(long)在超时内没有返回的问题

时间:2013-05-10 04:57:04

标签: java jms activemq

MessageConsumer.receive(long)允许在接收时指定超时。

但是,我发现如果你让生产者离开(例如通过杀死进程),消费者的接收并不总是超时。事实上,有时它会永远等待,而且这个过程永远不会退出。

事实证明我可以在连接中添加ExceptionListener,但这有一些缺点: (1)除了我试图执行的操作之外,我可能会遇到错误; (2)接收()本身仍然不一定完成; (3)显然我们曾经使用ExceptionListener,它引起了一些我不了解的具体问题。

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

这是一个理智的解决方案吗?对于这个问题,是否有更可靠,众所周知,常用的解决方法?

1 个答案:

答案 0 :(得分:0)

您可以设置消息监听器,而不是使用接收。这似乎是ActiveMQ中的一个错误,你有没有在JIRA中将其报告为一个问题?