2016-11-08 115 views
0

根據Apache Camel documentation,「Camel支持使用EIP模式中的保證傳送以及其他組件:...... JMS」。在Apache Camel路由保證傳送中使用JMS嗎?

我想了解這是否意味着我可以在多組件路徑中使用JMS來「保證交付」。

例如,我有一些路線,看起來像這樣:

from("rest://post:someRestRoute") 
    // blah blah 
    .to("jms:queue:someQueue"); 

from("jms:queue:someQueue") 
    // blah blah 
    .to("spring-ws:someAddress") 
    .to("someOtherRoute"); 

是否在多分量的路徑的中間使用JMS有什麼好處? Camel正在寫隊列和讀隊列,並且隊列在同一臺計算機和同一個JVM上運行,所以Camel只能保證交付給自己,這似乎是多餘的。

例如,

  1. 的消息被髮布到someRestRoute
  2. 該消息在someQueue上排隊並持續存在。
  3. 消息立即出列。
  4. 該消息發送到網絡服務someAddress

據我所知,就JMS代理而言,消息在成功出隊的那一刻就「交付」了;如果spring-ws:someAddress引發異常,則無關緊要。我想這可能會有所幫助,如果駱駝在步驟2之後立即崩潰,但我希望能保證送達someAddress

在多組件路線中使用JMS有什麼好處嗎?在示例中它可以用於「保證交貨」到someAddress嗎?

回答

2

僅當您的JMS隊列被定義爲保留消息時。然後,如果您的路由/應用程序/服務器在拾取消息之前停止,它將在隊列中,直到下一次路由啓動時處理。 如果你不需要持久化,那麼沒有理由擁有JMS。 Camel可以設置爲在發生故障時重試傳輸到端點。

但是,如果您需要持久性,JMS是最好的(如果不是唯一的一種)方法。

+0

我很難理解爲什麼消息會留在隊列中超過幾毫秒。應用程序已經在處理消息,爲什麼將它放在隊列中以便立即再次取消它? – DavidS

+0

嗯...讓說你需要一個保證傳遞,並在某些情況下放置消息,但沒有選擇,因爲許多requestes來了,JVM運行fullGC或壓縮,服務器重新啓動,電源關閉等等。然後,你需要一個持久性 – Vadim

+0

另一個和更重要的情況是集羣環境。如果是direct:direct-vm:seda:它運行在一個JVM或CamelContext中的某種端點)。讓JMS處於中間可以處理任何數量的其他服務器中的消息。 – Vadim