我有第三方應用程序將一些消息放入JMS隊列。 另外我有一個應用程序從這個隊列中讀取消息。根據消息的類型,我將此消息保存到數據庫或發送給第三方服務。此外,我們不應該超過每秒固定呼叫限制,不要超載第三方。JMS隊列拆分。企業集成。 Apache Camel
目前,我對這個用例有兩種解決方案。
第一個問題是要求第三方發送一些自定義標題,以便JMS使用者能夠使用JMS選擇器過濾消息。因此,在這種情況下,我們可以創建兩個消費者,第一個消費者可以讀取消息並將其保存到數據庫中,第二個消費者將使用一些調節/輪詢機制在特定負載下向第三方發送消息。 但是這種方法對我不起作用,因爲第三方需要很長的時間來添加這些自定義標題。像這樣在駱駝:
from("jms:queue?selector=firstSelector")
.bean(dbSaver);
from("jms:queue?selector=secondSelector")
.throttle(10)
.bean(httpClient);
第二個是創建另一個兩個JMS隊列和將分裂這些隊列之間的消息的處理器。然後採用與第一種解決方案相同的邏輯。但是,這意味着應該添加2個額外的JMS隊列。在駱駝:
from("jms:parentQueue")
.choice()
.when(body().contains(...))
.to("jms:fistChildQueue")
.otherwise()
.to("jms:secondChildQueue")
.end()
from("jms:fistChildQueue")
.bean(dbSaver);
from("jms:secondChildQueue")
.throttle(10)
.bean(httpClient);
此外,我一直在考慮使用兩個內存中的隊列,而不是JMS隊列。但是,在這種情況下,如果JMS Queue中會有大量消息,我們可能會很容易陷入內存問題。
任何人都可以提出這個用例的建築設計嗎?以駱駝路線的風格來看它真是太棒了。
有兩個額外的隊列並不是什麼大不了的事情,JMS代理可以處理數千個隊列。也就是說,如果你不想對插入物進行批量處理,Darius的選項#1會更有意義。 –