2017-05-03 1 views
1
나는 경로를 구성하는 자바 DSL을 사용하고

. 아래에 주어진 것과 비슷한 경로가 있습니다.아파치 낙타 - 처리 및 다시 throw 예외

RouteBuilder builder = new RouteBuilder() { 
     public void configure() { 
      // onException(Exception.class).bean("bean"); 

      onException(Exception.class).to("anotherProcessor"); 

      from("queue:a").bean("someBean").to("processor"); 
     } 
    }; 

몇 가지 작업을 수행 한 후에 예외를 어떻게 울리나요? 예외적으로 예외를 다시 던지기 위해 프로세서와 빈을 구성 해 보았습니다. 어느 쪽이든, 낙타는 교환을 위해 예외를 설정하고 있지만 예외는 날려 버리지 않습니다.

나는 JUnit 테스트 케이스에이 일을하고있다. onException 프로세서를 사용하여 예외를 처리하고 있습니다. 프로세서 내부에서 나는 내 주장을하고있다. 어설 션 오류는 낙타에 의해 자동으로 처리되며 테스트는 합격/불합격으로 표시되지 않습니다.

+0

당신은 "예외를 폭파"무엇을 의미합니까? 어떤 종류의 행동을 성취하고 싶습니까? – Ralf

+0

난 프로세서 onException을하고 에러 또는 예외가 발생하는 경우, 상기 제어는 DelegateSyncProcessor로 진행하여 예외/오류가 클라이언트에 발포되지 않는다. –

+0

Camel JMS 구성 요소를 사용하고 있습니까? 그렇다면'transferException = true'를 설정해야합니다 ([documentation] (http://people.apache.org/~dkulp/camel/jms.html) 참조). 'onException' 문에서'.handled (false)'를 호출해야 할 수도 있습니다. 나는 오류가 프로세서에 의해 처리되는 경우 Camel 기본값이 무엇인지 기억하지 못합니다. 카멜은 기본적으로 예외 처리로 표시 할 수 있습니다. – Ralf

답변

0
from(CONSUMER) 
    .doTry() 
    .doCatch(SocketTimeoutException.class,Exception.class) 
      .beanRef("ErrorProcessor","processErrorMessage") 
      .to("freemarker:ErrorResponseTransformer.ftl") 
    .end() 
    .to(PRODUCER) 

시도 캐치 표시하는 응답 오류 메시지와 같은 예외 핸들 예외 처리 그것을

onException(Exception.class) 
     .handled(true) 
     .process(new Processor() { 
      public void process(Exchange e) throws Exception { 
       helper.processErrorMessage(e); 
       log.info("Response error: " 
         + MessageHelper.extractBodyAsString(e.getIn())); 
       log.info("Response error: " 
         + MessageHelper.extractBodyAsString(e.getOut())); 
      } 
     }); 

. .to(ERRORDESTINATION) 또는 도청기를 삽입하여 정상적인 흐름을 계속할 수도 있습니다.

또는 낙타의 ErrorHandler를 사용합니다.

희망이 도움이됩니다.

+0

나는 프로세서 onException을 가지며 오류나 예외가 발생하면 컨트롤은 DelegateSyncProcessor로 이동하고 예외/오류는 클라이언트에 버블 링되지 않습니다. 모범 사례를 처리 –

+0

오류 ->를 DeadLetterChannel 또는 ErrorHandler를 어떤 처리되지 않은 예외가 잡힐해야 있도록 인터페이스가 확장되는 당신의 프레임 워크 또는 수퍼 클래스에서 기본적으로이 있어야합니다. –

+0

내 질문을 업데이트했습니다. –