如何判断java.jms.TopicSubscriber何时与MessageBroker失去连接?

如何判断java.jms.TopicSubscriber何时与MessageBroker失去连接?,java,jms,Java,Jms,今天我在试验TopicSubscriber对象(使用ActiveMQ作为我的消息代理和JMS提供程序)。我发现,如果我在建立连接后启动了同步接收(有2毫秒的超时),那么如果我在与ActiveMQ建立连接和启动第一次接收之间停止ActiveMQ,就会引发异常。但是如果我进行了连接,然后成功接收,然后停止了代理,然后进行了第二次接收,那么我没有在该接收上引发异常,而是始终收到一条空消息——没有迹象表明与代理的连接丢失——即使在等待数小时之后。然后,在重新启动ActiveMQ之后,除非我的程序关闭并重

今天我在试验TopicSubscriber对象(使用ActiveMQ作为我的消息代理和JMS提供程序)。我发现,如果我在建立连接后启动了同步接收(有2毫秒的超时),那么如果我在与ActiveMQ建立连接和启动第一次接收之间停止ActiveMQ,就会引发异常。但是如果我进行了连接,然后成功接收,然后停止了代理,然后进行了第二次接收,那么我没有在该接收上引发异常,而是始终收到一条空消息——没有迹象表明与代理的连接丢失——即使在等待数小时之后。然后,在重新启动ActiveMQ之后,除非我的程序关闭并重新打开与它的连接,否则它的所有接收都将无法工作


我知道我可以围绕这一点进行编码,但我想知道我是否错过了一些东西,因为我不知道如何判断我的连接是否丢失-请告诉我是否有办法,或者这是否只是ActiveMQ JMS实现的一个“功能”,我需要围绕它进行编码。

我已经使用ActiveMQ好几年了,尽管是使用队列而不是主题,我从未见过这样的行为。我可以看到,如果一个连接在代理无法正确断开消费者连接的情况下被中断,消费者可能不会立即意识到问题。我不确定,但我认为ActiveMQ消费者在建立连接后不会与代理进行太多的交谈。他们只是等待消息被传递。尽管如此,我还是希望会有某种心跳,而且在上,这确实意味着OpenWire有一个默认的30秒空闲时间。尝试进行一些网络监控,以查看消费者是否尝试发送任何内容。如果它知道,但仍然没有意识到连接已断开,那么就有可疑的事情发生了。否则,这可能只是找到一个正确的方法来维持生命的问题。这项调查可能也很好。

谢谢你,Ryan。我确信部分问题在于我关闭ActiveMQ的方式。我只是按下CTRL-C并说是终止它。如果事情“更好”的话,我会看看我是否会彻底关机。仅供参考,我也可能会因为定期同步抓取可用消息而感到奇怪,而不仅仅是等待它们异步传递。Javadoc说如果那里什么都没有,我会得到一条空消息。如果代理关闭,是否应该抛出异常有点模棱两可。请注意,从现在开始,我可能只是连接、获取消息和断开连接。我试图在整个轮询过程中保持连接,但如果我亲眼目睹的行为发生,我就不会这样做。我希望有一种简单的方法来验证连接是否仍然存在,但我还没有看到。@Dale:如果“同步抓取”是指consumer.receive()或类似的东西,那么您需要知道调用该方法不会在调用时“接触”服务器。为了提高效率,ActiveMQ将消息分批传递给消费者(我相信默认的批量大小是1000),消费者将消息保存在内部队列中。调用consumer.receive()只从该内部队列获取一条可用消息。它没有击中服务器。我发现管理JMS的最简单方法是via.Eureka。我在做消费者。接收(2)。从你所说的,我看到了我所看到的,因为当我第一次接收时,它会击中服务器-因此,如果服务器关闭,会抛出一个异常,但是当我第二次接收时,逻辑不会麻烦到服务器,所以它不知道抛出一个异常。我刚刚得到空值。仅供参考,今天早上我尝试了keepAlive=true,结果没有什么不同。我会稍微改变一下我的设计来应对这种情况。非常感谢你在这方面的帮助。@Dale:很高兴我能帮忙。我很想知道你是否还发现了这个问题。