特定の例外についてラクダスプリッターでループを停止するにはどうすればよいですか? "stopOnException()"はすべての例外のループを停止していますが、代わりに特定の例外に対してのみループを停止したいとします。そして、例外が "HttpOperationFailedException"である場合、私は応答コードに基づいてループを停止したいと思います。 たとえば、応答コードが "500"の場合は実行を停止し、応答コードが404の場合は実行を続行します。ラクダスプリッター - 特定の例外に関するループの停止
可能ですか?
元の質問
from("timer:categoryRouter?delay=0")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("A,F,B,D,C");
}
})
// tell Splitter to use the aggregation strategy which handles and ignores exceptions
.split(body(), new MyIgnoreFailureAggregationStrategy())
.stopOnException()
// log each splitted message
.log("Split line ${body}")
// and have them translated into a quote
.bean(WordTranslateBean.class)
// and send it to a mock
.to("mock:split")
.end()
// log the outgoing aggregated message
.log("Aggregated ${body}")
// and send it to a mock as well
.to("mock:result");
例外をスロー豆:
public class WordTranslateBean {
private Map<String, String> words = new HashMap<String, String>();
public WordTranslateBean() {
words.put("A", "Camel rocks");
words.put("B", "Hi mom");
words.put("C", "Yes it works");
}
public String translate(String key) throws HttpOperationFailedException {
if (!words.containsKey(key)) {
HttpOperationFailedException httpOperationFailedException = null;
if(key.equals("F")) {
httpOperationFailedException = new HttpOperationFailedException("uri",500,"Internal Server Error","location",null,"Key not a known word " + key);
}
else {
httpOperationFailedException = new HttpOperationFailedException("uri",404,"Resource Not Found","location",null,"Operation not supported on word " + key);
}
throw httpOperationFailedException;
}
return words.get(key);
}
}
作業溶液:あなたはベースのカスタム例外をスローしませんなぜ
from("timer:categoryRouter?delay=0")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("A,F,B,D,C");
}
})
// tell Splitter to use the aggregation strategy which handles and ignores exceptions
.split(body(), new MyIgnoreFailureAggregationStrategy())
.stopOnException()
// log each splitted message
.log("Split line ${body}")
// and have them translated into a quote
.doTry()
.bean(WordTranslateBean.class)
// and send it to a mock
.to("mock:split")
.doCatch(HttpOperationFailedException.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
HttpOperationFailedException e = (HttpOperationFailedException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
if(e.getStatusCode()!=404){
throw e;
}
}
})
.end()
.end()
// log the outgoing aggregated message
.log("Aggregated ${body}")
// and send it to a mock as well
.to("mock:result");
ありがとうございました!また、ルートコードを含めるように私の質問を編集しました。 – Shyam
@Shyam Cheersしかし、他のすべての例外を抑制するために、もう1つのcatchブロックを追加する必要があると思います。この記事は、ほんの数ヶ月後に例外処理を文書化した場合に役立つかもしれません - http://bushorn.com/exception-handling-in-camel/。がんばろう 。 – gnanagurus