2017-06-15 110 views
0

目前,我的用於根據JMS消息頭字段在駱駝中路由消息的代碼看起來是這樣的:駱駝:基於在地圖上的內容路由消息

// MyRouteBuilder.java 
@Override 
public void configure() { 

    from(...) 
     .choice() 
      .when(header("type").isEqualTo("A")) 
       .to("proc_a:1") 
      .when(header("type").isEqualTo("B")) 
       .to("proc_b:1", "proc_b:2", "proc_b:3") 
      .when(header("type").isEqualTo("C")) 
       .to("proc_c:1", "proc_c:2") 
      .when(...) 
       .to(...) // ~15 more branches to follow 
      .otherwise() 
       .to("proc_default"); 
} 

Dependend上type頭字段的值,在每種情況下都應該使用特定的處理器流水線。正如你所看到的,代碼不僅是重複的,而且還很麻煩。

已經存在動態創建的Map<String, String[]>,其將類型映射到處理器,例如,密鑰B返回["proc_b:1", "proc_b:2", "proc_b:3"]。但是,我不知道如何在上面的場景中使用它。我也讀了關於dynamic router。然而,給定的例子並沒有真正幫助我,我不想通過管理我的路由邏輯狀態或確保線程安全來增加更多的複雜性。

我很感激任何解決方案。唯一的要求是我堅持使用Camel 2.15,並且我不允許修改現有的處理器(這尤其意味着路由邏輯不應該刪除任何標題字段,因爲它們稍後需要)。

回答

0

使用動態到(例如toD),在您使用一些Java方法來計算URL路由到:http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html這裏還有約動態到http://camel.apache.org/message-endpoint.html

+0

感謝您的答覆。不幸的是,我忘記提及我被卡駱駝2.15卡住了。根據你的鏈接,我認爲這意味着我必須使用'.recipientList()。method(MessageRouter.class,「routeTo」);'。這給我帶來了兩個問題。 ** 1。**如何從'MessageRouter'內部訪問頭文件? ** 2。**根據我的理解,收件人列表模式將*相同*消息分發到多個目的地。但在我的情況下,每個頭映射到應該被順序調用的處理器列表(例如,* proc_b:2 *應該看到* proc_b:1 *所做的更改。這是可能的嗎? – ceran

+0

只需返回一個多個端點分隔的字符串事實上,這就是收件人列表EIP的全部內容,要發送一條消息到由該收件人列表確定的一個或多個目的地 –

+0

我明白,但作爲非母語英語的發言者,我很困惑在文檔中使用的單詞* copy *如下:*「...第二部分簡單地遍歷列表並將收到的消息的副本發送給每個收件人」*。但在這種情況下,複製僅意味着對非常相同的對象(所有接收者都可以觀察到變化)?或者我們真的在談論單個拷貝? – ceran