2016-04-08 7 views
1

特定の例外についてラクダスプリッターでループを停止するにはどうすればよいですか? "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"); 

答えて

1

オンレスポンスコード?それは一つの選択肢です。基本的に、元のhttp例外をキャッチし、レスポンスコードをチェックし、カスタム例外をスローすることができます。あなたはあなたのルートを投稿できますか?この方法を実装するのは簡単ですが、経路をどのように編成したかを確認したいだけです。

+0

ありがとうございました!また、ルートコードを含めるように私の質問を編集しました。 – Shyam

+0

@Shyam Cheersしかし、他のすべての例外を抑制するために、もう1つのcatchブロックを追加する必要があると思います。この記事は、ほんの数ヶ月後に例外処理を文書化した場合に役立つかもしれません - http://bushorn.com/exception-handling-in-camel/。がんばろう 。 – gnanagurus

0

例外をキャッチして、それらの処理方法を決定できます。あなたのスプリッターの内部:

+1

あなたの答えをありがとう。私はあなたのソリューションを試しましたが、私は特定の例外をキャッチし、キャッチブロックで "停止"を使用しても、スプリッタは停止されませんでした。 – Shyam

0

例外が発生したときにスプリッターを停止するには、基本的にはまだ "stopOnException"を使用する必要があります。しかし、スプリッタがどの例外を壊すべきかを制御するには、 "doTry..doCatch"ブロックを使用し、それぞれのcatchブロックで例外を再度スローします。

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()) 
        // 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) 
         .log("Ignore Exception") 
        .doCatch(IOException.class) 
         .throwException(new IOException()) 
        .doCatch(UnsupportedOperationException.class) 
         .log("Ignore Exception") 
        .end() 
       .end() 
       // log the outgoing aggregated message 
       .log("Aggregated ${body}") 
       // and send it to a mock as well 
       .to("mock:result"); 

例外がhttpに関連していて、それに応じて応答コードを検査したい場合、私の質問にはうまくいきます。