[英]Camel exception routing in a split EIP
我正在將CSV文件輸入與較大的系統集成在一起,並且我希望對其進行設置,以使未正確解析的CSV的各個行(由split
)將發送到醫院隊列,並且所有其他工作行將轉換為對象並聚合為列表。 但是,我很難將split
引發的異常消息發送到其他地方,並且在拆分結束時不會出現在聚合器中。 為了簡化它,我編寫了一個單元測試,該單元測試在拆分中引發異常,並且我試圖使其正常工作。 我將字符串1\\n2\\n3\\n
分成三個消息,在其中之一上引發異常,並在末尾連接其余字符串。
public void configure() throws Exception {
onException(Exception.class)
.handled(true)
.to("log:dead?level=ERROR");
from("direct:test")
.split(body().tokenize("\n"), new MyAggregationStrategy())
.process(new ThrowMyException())
.end()
.to("mock:out");
}
@Test
public void test() throws InterruptedException {
MockEndpoint out = getMockEndpoint("mock:out");
out.expectedMessageCount(1);
template.sendBody("direct:test", "1\n2\n3\n");
assertMockEndpointsSatisfied();
}
ThrowMyException控制器:只是拋出一個異常
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("[" + exchange.getIn().getBody() + "]");
if (exchange.getIn().getBody(String.class).trim().contentEquals("2")) {
System.out.println("Throwing exception");
throw new Exception();
}
}
MyAggregationStrategy:僅串聯字符串
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
return newExchange;
}
oldExchange.getIn().setBody(
oldExchange.getIn().getBody(String.class) +
newExchange.getIn().getBody(String.class));
System.out.println(oldExchange.getIn().getBody());
return oldExchange;
}
我期望的是onException
處理程序,正如我已經指出的那樣,它是要處理異常( handled(true)
),它將在收到消息“ 2”時消耗控制器拋出的異常,並且我將獲得聚合器打印出結果13
。 我確實通過onException
處理程序將行打印出來:
錯誤無效-Exchange [ExchangePattern:InOnly,BodyType:字符串,Body:2]
但是聚合器然后返回“ 123”而不是“ 13”。
我也嘗試過使用deadLetterChannel
errorHandler(deadLetterChannel("log:dead?level=ERROR")
而且我也嘗試過在onException
處理程序中指定continued(false)
,但沒有運氣。
我意識到我可以通過查看exchange.getProperty(Exchange.EXCEPTION_CAUGHT)
在聚合器中查找異常,然后不對其進行聚合。 所以我有解決方案。 但是,如果有一種方法可以使用onException
或errorHandler
在我的路由中執行onException
,則我更願意這樣做。
stopOnException
Splitter選項的駱駝文檔說
發生異常時是否停止立即繼續處理。 如果禁用,則Camel繼續拆分並處理子消息,無論它們之一是否失敗。 您可以在AggregationStrategy類中處理異常,在該類中可以完全控制如何處理異常。
這與Camel In Action一起建議兩個拆分器異常處理選項用於處理Aggregator中的異常,或者使用stopOnException()
,這將阻止整個拆分器迭代器繼續運行。
您可以使用exchange.getException()
方法或exchange.isFailed()
來測試聚合器中的異常和錯誤。 如果在onException
方法上使用了onException
handled(true)
,則必須使用exchange.getProperty(Exchange.EXCEPTION_CAUGHT)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.