簡體   English   中英

拆分EIP中的駱駝異常路由

[英]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)在聚合器中查找異常,然后不對其進行聚合。 所以我有解決方案。 但是,如果有一種方法可以使用onExceptionerrorHandler在我的路由中執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM