簡體   English   中英

JMS隊列拆分。 企業整合。 Apache Camel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM