[英]Apache Camel JMS: “Not allowed to create destination” when trying to connect to a queue
[英]JMS Queue Split. Enterprise Integration. Apache Camel
我有一個第三方應用程序,它將一些消息放入JMS隊列。 我還有一個應用程序從該隊列中讀取消息。 根據消息類型,我將此消息保存到DB或將其發送到第三方服務。 此外,我們不應超過一些固定的每秒呼叫限制,以免超載第三方。
目前,我想到了這個用例的兩個解決方案。
第一個是要求第三方發送一些自定義標頭,以便JMS使用者能夠使用JMS選擇器過濾消息。 因此,在這種情況下,我們將能夠創建兩個使用者,第一個將能夠讀取消息並將其保存到DB,第二個將使用一些限制/輪詢機制在特定負載下向第三方發送消息。 但是這種方法對我來說不起作用,因為第三方添加這些自定義標題需要很長時間。 像Camel這樣的東西:
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隊列中存在大量消息,我們很容易陷入內存困境。
有人可以建議這個用例的架構設計嗎? 用Camel Route風格來看它會很棒。
1.你真的需要一個隊列來流向數據庫嗎? 您可以在第一個路由中使用bean(dbSaver),或將其抽象為“直接”路由而不是消耗jms的路由。 這樣,您有兩個隊列而不是三個隊列。
2.第二種方法:如果您可以控制數據庫,則可以將第二種類型的消息寫入另一個表。 然后,sql-consumer可以輪詢記錄,並在消耗它們時刪除它們並將它們傳遞給http服務。 但是,該表就像是“滾動你自己的Q”。 可能更多的工作只需很少的回報,所以也許第二個隊列更好。
3.最后,我想知道你是否可以重用相同的隊列。 我看到一個選項,允許您回寫到同一個隊列。 您可以添加標題並回寫某些消息。 這可能看起來令人困惑,而錯誤可能會產生無限循環。
如果您已經使用了JPA,那么使用camel-jpa組件可以更容易。 作為消費者,它會讀取和刪除記錄(默認行為)。 我認為SQL / JDBC組件沒有開箱即用的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.