2011-08-10 67 views
0

我今天正在试验一个TopicSubscriber对象(使用ActiveMQ作为我的消息代理和JMS提供者)。我发现,如果我在建立连接后启动了一个同步接收(具有2 ms超时),那么如果在建立到它的连接并启动第一次接收之间停止ActiveMQ,则会引发异常。但是,如果我做了连接,然后成功接收,然后停止代理,然后再次接收,而不是在该接收上抛出异常,我始终只收到一条空消息 - 没有指示连接到这位经纪人甚至在等了几个小时后就迷路了。然后,重新启动ActiveMQ后,除非我的程序关闭并重新打开它的连接,否则它的任何接收都不起作用。如何判断java.jsp.TopicSubscriber何时失去与消息代理的连接?

我知道我可以对此进行编码,但我想知道如果我知道如何判断我的连接是否丢失 - 是否遗漏了某些东西 - 请告诉我,如果有方法,或者这只是一个方法ActiveMQ的JMS实现的“功能”,我需要编码。

回答

1

我一直在使用ActiveMQ几年,虽然与队列,而不是主题,我从来没有见过这样的行为。也许我可以看到,如果一个连接在没有代理能够正确断开消费者连接的情况下中断,消费者可能不会立即意识到这个问题。我并不确定,但我认为ActiveMQ用户在建立连接后不会与代理进行多少交谈。他们只是等待消息传递。不过,我希望有一些心跳,并且在OpenWire Format page上,它确实意味着OpenWire有一个默认的30秒空闲时间。尝试做一些网络监测,看看消费者是否曾尝试发送任何东西。如果它确实存在,但仍然不能识别连接已经死亡,那么就有可疑的事情发生。否则,这可能只是寻找保持活力的正确方法。也可以调查TCPTransport keepalive

+0

谢谢你,瑞恩。我相信问题的一部分是我关闭ActiveMQ的方式。我只是按下CTRL-C,并说是终止它。如果事情“更好”,我会看看我是否彻底关闭了。仅供参考,我也可能因为定期同步抓取可用消息而不是仅仅等待它们异步交付而变得怪异。 Javadoc说,如果没有什么东西,我会收到一条空消息。如果经纪人关闭,是否应抛出异常,这有点含糊不清。 – Dale

+0

注意从现在开始,我可能只需连接,获取消息并断开连接。我试图通过轮询保持连接,但如果我目击的行为发生,则不行。我希望有一个简单的方法来验证连接仍然存在,但我没有看到过。 – Dale

+0

@Dale:如果“同步抓取”意味着consumer.receive()或类似的东西,那么您需要知道调用该方法在调用它时不会“伸手”到服务器。为了提高效率,ActiveMQ将消息批量传递给消费者(我相信默认批量为1000),消费者将其保存在内部队列中。调用consumer.receive()只是从这个内部队列中获得一条可用消息。它不会击中服务器。我发现管理JMS的最简单方法是通过[Spring JMS](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jms.html)。 –

相关问题