2016-01-20 106 views
1

簡體:
我在activemq中有一個隊列。當從隊列中讀取某個消息時,我想鎖定隊列,直到該過程結束處理收到的消息。如何保留消息隊列

詳細解釋:
我有一個系統有大量的用戶。每次用戶更改系統狀態(配置文件,角色,訪問權限,資產所有權等)時,我還需要更新第三方服務器的更改。 該第三方與我們分開,它們暴露給我的api允許我一次只更新一個用戶,並且需要一秒左右的時間。
我正在使用ActiveMQ從更新第三方系統中分離主更新過程。

一晚上,我得到一個可能包含數千個用戶更改的提要文件。由於這是一項關鍵任務,並且更新第三方並不那麼時間敏感,並且由於更新第三方可能需要從同一個表中讀取主進程是批量更新,所以我需要鎖定隊列。 意思是說,我希望activeMQ爲我在主進程中更改的每個用戶獲取消息,但我也希望ActiveMQ能夠保留這些消息,直到主進程完成。

ActiveMQ中的任何內置機制如何實現?

+0

如果我理解正確,您的系統是[更新過程] -AMQ-> [適配器] - > [第三方API],並且您不希望適配器運行,直到更新過程已經完成所有的信息在? –

回答

0

通常情況下,您每消費者一次閱讀郵件。

您通常有一個監聽器,看起來像這樣:

void onMessage(Message message) { 

    // .. 
    updateExternalAPI(); // Sync. call to external API 

} 

因此,當你onMessage方法結束,該消息被提交,消費者會在下一消息繼續。因此,一次只能處理一條消息 - 如果只有一個消費者。

如果您的服務器應用程序只有一個節點,這很容易 - 只需將其配置爲僅使用單個使用者即可。它在不同的框架/客戶端庫中有點不同。

如果你不能做到這一點和/或有多個節點 - ActiveMQ提供了一個解決方案。將?consumer.exclusive=true添加到客戶端的隊列中,以強制ActiveMQ選擇單個使用者來發送消息。

示例UPDATE.USER.INFO?consumer.exclusive=true

+0

有一個消費者。但是當一個任意進程正在運行時,他所希望的是,ActiveMQ將不會再釋放其隊列中的消息。他希望ActiveMQ堅持這些消息,直到AMQ獲得「綠燈」 –

+0

這是正確的。我已經實現了自己的鎖定解決方案,但是想知道是否有辦法表示AMQ鎖定單個主題/隊列 –