1. 程式人生 > >activemq傳送訊息接收不到問題排查

activemq傳送訊息接收不到問題排查

昨天,在公司開發環境上嘗試資料同步,涉及到兩個服務,服務A釋出主題,服務B監聽訊息,然後同步A表中的資料到B表;

由服務A通過activemq釋出訊息到一個topic:VirtualTopic.topic,發現服務A日誌上顯示傳送訊息成功,VirtualTopic.topic對應的Messages Enqueued數目增加了2,表明topic上也產生了相應數目訊息佇列;但是服務B日誌上遲遲沒有列印接收訊息的日誌,到服務B接收資料的表中檢視也沒有同步過來的資料,到activeMQ視覺化介面上檢視,果然沒有訊息被消費;

 

為了節省資源,公司的activeMQ是新安裝在虛擬機器上的,原來安裝activeMQ的實體機伺服器不再使用,於是猜測肯定安裝過程出現了與之前不一致的現象;

排查原因:

1.猜測讀取了重名的配置檔案:我們使用的activemq.xml是放在一個公共jar包中引入的,更改mq伺服器後,原來存放activemq.xml的資料夾被重新命名為conf_old,新的配置檔案還是放在conf路徑下,這樣jar包中就有了兩個acrivemq.xml檔案,於是猜測是不是程式在讀取jar包中xml檔案時讀取到了老的配置,所以監聽的activemq服務ip錯誤,但是到老的activemq上顯示的消費者為0,新的activemq上顯示消費者為2,除了我和伺服器上之外沒有別人啟動服務B,自然這種可能就被排除了;

2.猜測由於activemq伺服器時間與本地時間不一致導致沒有接受到訊息:網上查了幾種原因,發現可能由於伺服器時間與本地時間不一致導致的,檢查本地時間,果然比伺服器時間快5分鐘,於是更改本地時間與伺服器時間一致,再次嘗試,依然沒有接收到訊息,這種可能也被排除;

3.發現A服務傳送訊息是用的topic模式,而服務B接收的只是佇列(Queues)訊息,沒有監聽對應的topic,會不會之前有什麼設定讓topic中的主題與queues中的佇列做了關聯:

於是求助公司的一位大佬,瞭解到在activemq的配置檔案中可能有對虛擬主題的配置,於是拉取原來伺服器的activemq.xml配置檔案與現在使用的activemq伺服器上的配置檔案進行比對,果然發現了不同,之前檔案多了一項配置:

<destinationInterceptors>

  <virtualDestinationInterceptor>

    <virtualDestinations>

      <virtualTopic name=">" prefix="Prename.*." selectorAware="false"/>

    </virtualDestinations>

  </virtualDestinationInterceptor>

</destinationInterceptors>

關於這個配置涉及到ActiveMQ高階特性Destination,看了兩篇文章講解了此特性的用法:

ActiveMQ高階特性:VirtualTopic 

https://blog.csdn.net/paul_wei2008/article/details/51252255

ActiveMQ Destination高階特性

https://blog.csdn.net/zhanglh046/article/details/52830624?locationNum=4

 

因為A服務釋出的訊息主題為VirtualTopic.topic,而B服務監聽的佇列為Prename.secname.VirtualTopic.topic,所以在配置中做了忽略字首的設定後就可以監聽到對應主題的訊息了,而問題也解決了:

A服務釋出訊息:

B服務消費訊息: