2012-02-06 106 views
8

作爲Apache Camel的新手,我最近查看了很長的組件列表,並偶然發現他們對SEDA queue組件的支持。普通隊列vs SEDA隊列

這個頁面對我來說沒什麼意義,所以我做了一些關於術語「SEDA隊列」的在線搜索,並得到了維基百科文章here

看完那篇文章之後,我無法分辨SEDA隊列與普通「普通」隊列之間的區別是什麼!兩者都採用通過使用異步隊列來解耦系統的概念。

從文章中,「SEDA」聽起來像一個架構,它由在每個組件之間放置一個隊列組成。它是否正確?

但是,如果它只是一個架構,那麼爲什麼「SEDA」隊列是一個特殊的Apache Camel組件呢?

+3

SEDA意味着像ExecutorService(隊列和線程池)那樣附加到隊列中的線程也許這就是它的意思。 – 2012-02-06 14:18:59

+0

我不知道這個問題是否被更新了文檔,但它基本上是說在第一行中:「seda:組件提供異步SEDA行爲,因此消息在BlockingQueue上交換,消費者被調用_in來自生產者的單獨線程。「 – DavidS 2017-03-31 21:26:42

回答

4

SEDA隊列就像一個普通隊列(正如Peter上面說的,在Camel中他們有一個線程池作爲組件的一部分與它們關聯)。 SEDA是一個架構。 Camel中的SEDA組件在您的進程中使用內存中隊列,並且它們是一個單獨的組件,以便將它們與Apache駝峯中的其他隊列組件(即JMS組件)區分開來。

1

SEDA提供單個駱駝路線內組件的解耦。或者在一個單獨的過程中。 。這意味着它可以幫助你對其他組件進行異步調用......它是一種內存阻塞隊列。 在另一方面JMS用於整個系統的解耦.. JMS將有涉及外部代理.. SEDA預訂購剛剛創建從消費者組件

3

SEDA一個單獨的線程是代表階段性事件的首字母縮寫驅動架構它被設計爲一種機制來調節消息處理的不同階段之間的流程。其思想是消除整個過程中消息輸出的頻繁程度,使其與輸入相匹配,它允許enpoint的消費者線程將長時間運行的工作卸載到bakground中,從而釋放消費者的消息從運輸。 將交換傳遞給seda:endpoint時,它將放入BlockingQueue中。該列表存在於駱駝上下文中,這意味着只有那些位於相同上下文中的路由才能被這種類型的端點加入。該隊列默認是無界的,儘管可以通過在消費者的URI上設置size屬性來更改該隊列。

默認情況下,分配給端點的單個線程會從列表中進行交換並通過路由處理它們。正如在前面的例子中所看到的,可以增加併發消費者的數量,以確保及時地從該列表中處理交換。

SEDA模式最適合處理InOnly消息,其中一條路由完成處理並交給另一個處理下一個階段。當消息交換模式爲InOut時,可以通過調用它來請求seda:endpoint的響應。

參考。 Apache Camel Developer's Cookbook