2015-10-23 48 views
1

我想提出繼續在路由的行爲,我的路線是像下面繼續在駱駝航線執行行爲

from("file:D:\\?fileName=abc.csv&noop=true").split().unmarshal().csv() 
.to("direct:insertToDb").end(); 

from("direct:insertToDb") 
.to("direct:getDataId") 
.to("direct:getDataParameters") 
.to("direct:insertDataInDb"); 

from("direct:getDataId") 
.to("sql:SELECT id FROM data WHERE name = :#name) 
.choice() 
.when(header("id").isGreaterThan(0)) 
.setProperty("id", header("id")) 
.otherwise() 
.log("Error for") 
.endChoice().end(); 

我想,如果直接:getDataId不找到任何記錄,我的路線的執行從當前記錄CSV跳過並編程處理下一個請求。這將等於繼續關鍵字。

我如何在Apache Camel路由中實現這一點?

回答

0

你有這個測試嗎?我建議你嘗試使用CamelTestSupport,因爲你想要的是駱駝將如何默認執行。

Camel Split Docs

  • stopOnException
  • 默認:假
  • 說明:是否要立即停止繼續處理的異常發生時。如果禁用,則駱駝繼續分裂並處理子消息,無論其中一個失敗。您可以在AggregationStrategy類中處理異常,您可以在其中完全控制如何處理該異常。
0

您可以修改您的路線是這樣的:

from("file:D:\\?fileName=abc.csv&noop=true").split().unmarshal().csv() 
.to("sql:SELECT id FROM data WHERE name = :#name?outputHeader=id&outputType=SelectOne) 
.choice().when(header("id").isGreaterThan(0)) 
    .to("direct:getDataParameters") 
    .to("direct:insertDataInDb") 
.end(); 
+0

如果假設直接:getDataParameters沒得到數據,然後我不得不把一個條件。 – ImranRazaKhan

+0

您只需根據SQL查詢結果的條件跳過其他兩個路由。而且你必須修改你的「direct:getDataId」路由,把查詢結果放到標題中。你可以使用「outputHeader」選項(camel.apache.org/sql-component.html)。這允許保留現有的消息正文(來自csv)。我編輯了我的例子,請再看一遍。 –