如何让activemq真正可靠?当经纪人断开连接时,邮件会丢失

时间:2014-01-30 23:57:21

标签: java java-ee jms activemq tomee

我们在Apache TomEE v1.6.0 +中内置了一个JEE6应用程序。有两个部分,云部分和地面部分。云部分旨在永远不会重新启动,因为它监视瞬态信息源,但创建JMS消息并将它们发送给它的代理。

地面部分旨在在白天重新启动,并且是复杂处理逻辑的所在。它也有一个连接到云代理的代理。

我们遇到的问题是,如果我们将TomEE的地面实例删除超过几分钟,然后再次启动它,云代理将无法提供堆叠的所有消息。此外,它也没有传递任何新消息,迫使我们重新启动它,这使我们失去了我们的消息。

以下是两个连接URI ...我们到底做错了什么?

云:

<Resource
    id="ActiveMQResourceAdapter"
    type="ActiveMQResourceAdapter">
    BrokerXmlConfig = broker:(ssl://0.0.0.0:61617?needClientAuth=true&amp;transport.keepAlive=true&amp;transport.soTimeout=30000,vm://localhost,network:static:(failover:(ssl://ground.somedomain.com:61617?keepAlive=true&amp;soTimeout=30000)))?persistent=true
    ServerUrl = vm://localhost
    DataSource = jdbc/activemq
</Resource>

接地:

<Resource
    id="ActiveMQResourceAdapter"
    type="ActiveMQResourceAdapter">
    BrokerXmlConfig = broker:(ssl://0.0.0.0:61617?needClientAuth=true&amp;transport.keepAlive=true&amp;transport.soTimeout=30000,vm://localhost,network:static:(failover:(ssl://cloud.somedomain.com:61617?keepAlive=true&amp;soTimeout=30000)))?persistent=true
    ServerUrl = vm://localhost
    DataSource = jdbc/activemq
</Resource>

非常感谢任何帮助。非常感谢!!

2 个答案:

答案 0 :(得分:3)

好的,我们学到了很多东西。

首先,我们切换到使用ActiveMQ的外部实例,而不是依赖于TomEE中的嵌入式实例。您必须首先启动代理,然后启动TomEE,或者TomEE将在启动时创建一个内部代理,并且您将不知所措,为什么不处理任何消息。然后,您可以通过设置BrokerXmlConfig =ServerUrl = tcp://localhost来将TomEE连接到代理。

接下来,我们切换到使用activemq http传输。这完全否定了任何网络断开问题,因为http是无状态的。然而,相对于tcp / ssl,它非常慢,但是消息传输并不是我们系统中最慢的点,所以无论如何它都无关紧要。您必须让外部代理同时监听http和tcp,因为TomEE通过TCP连接,远程代理通过http连接。

这两件事解决了我们的问题,我们现在有一个完全稳固的系统。我希望这有助于某人!!

答案 1 :(得分:1)

不确定您是使用主题还是队列,但JMS规范说只有队列和持久订阅者可以利用存储转发保证传递。

对于非持久订阅者,非持久性消息将“​​最多”传递一次,但如果不活动则会丢失。

请查看以下网址,该网址详细说明了ActiveMQ中保证消息传递如何适用于主题和队列:

http://www.christianposta.com/blog/?p=265