2014-01-30 23 views
2

我們有一個JEE6應用程序內置在Apache TomEE v1.6.0 +。有兩部分,雲部分和地面部分。雲部分旨在永遠不會重新啓動,因爲它監視瞬態信息源,但創建JMS消息並將它們發送給它的代理。如何讓activemq真正可靠?當經紀人斷開信息丟失

地面部分旨在白天可以重新啓動,並且是複雜的處理邏輯。它也有一個經紀人連接到雲代理。

我們遇到的問題是,如果我們將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> 

任何幫助深表感謝。非常感謝你!!

+0

請同時發佈您的activemq.xml – Leo

回答

3

好吧,我們學到了幾件事情。

首先,我們切換到使用ActiveMQ的外部實例,而不是依靠TomEE中的嵌入式實例。您需要先啓動代理,然後啓動TomEE,否則TomEE會在啓動時創建一個內部代理,並且您將頭痛不已,爲什麼不處理任何消息。然後通過設置BrokerXmlConfig =ServerUrl = tcp://localhost將TomEE連接到經紀商。

接下來,我們切換到使用activemq http傳輸。這完全否定了任何網絡斷開連接問題,因爲http是無狀態的。然而,相對於tcp/ssl它非常慢,但消息傳輸並不是我們系統中最慢的一點,所以無論如何它並不重要。您必須讓外部代理偵聽http和tcp,因爲TomEE通過TCP連接,並且遠程代理通過http連接。

這兩件事解決了我們的問題,我們現在有一個完全可靠的系統。我希望這可以幫助別人!!

1

不確定您是否正在使用主題或隊列,但JMS規範說明只有隊列和持久訂戶才能利用存儲轉發保證的交付。

對於非持久訂閱者,非持久性消息將「​​最多一次」遞送,但如果不活動則將被錯過。

請看看以下URL其中詳細解釋了保證的消息是如何工作的主題和隊列中的ActiveMQ:

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

+0

使用隊列。消息偵聽器上是否有一個設置使其持久? –

+0

術語持久訂戶僅適用於主題。對於隊列偵聽器,如果隊列中有消息並且消息未過期,即使重新連接後它也應該能夠獲取它。確保你的信息沒有過期。 –

+0

感謝您的澄清。這很奇怪,因爲我們失去了大量的消息......並且重新啓動後消息流似乎停止。 :/不知道我們做錯了什麼。 –