我们在Apache TomEE v1.6.0 +中内置了一个JEE6应用程序。有两个部分,云部分和地面部分。云部分旨在永远不会重新启动,因为它监视瞬态信息源,但创建JMS消息并将它们发送给它的代理。
地面部分旨在在白天重新启动,并且是复杂处理逻辑的所在。它也有一个连接到云代理的代理。
我们遇到的问题是,如果我们将TomEE的地面实例删除超过几分钟,然后再次启动它,云代理将无法提供堆叠的所有消息。此外,它也没有传递任何新消息,迫使我们重新启动它,这使我们失去了我们的消息。
以下是两个连接URI ...我们到底做错了什么?
云:
<Resource
id="ActiveMQResourceAdapter"
type="ActiveMQResourceAdapter">
BrokerXmlConfig = broker:(ssl://0.0.0.0:61617?needClientAuth=true&transport.keepAlive=true&transport.soTimeout=30000,vm://localhost,network:static:(failover:(ssl://ground.somedomain.com:61617?keepAlive=true&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&transport.keepAlive=true&transport.soTimeout=30000,vm://localhost,network:static:(failover:(ssl://cloud.somedomain.com:61617?keepAlive=true&soTimeout=30000)))?persistent=true
ServerUrl = vm://localhost
DataSource = jdbc/activemq
</Resource>
非常感谢任何帮助。非常感谢!!
答案 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中保证消息传递如何适用于主题和队列: