2017-10-03 6 views
1

저는 스프링 통합 java dsl을 사용하여 전자 메일을 보내는 서비스 작업을하고 있습니다.직접 채널을 사용하는 메시지 분할기 이후 오류 처리

전자 메일로 변환되는 개별 메시지 모음으로 분할 된 배치 메시지가 있습니다.

이러한 개별 메시지 중 하나에서 오류가 발생하면 일괄 처리의 다른 메시지가 처리되지 않습니다.

메시지가 예외를 throw 할 때 예외가 정상적으로 처리되고 일괄 처리의 다음 메시지가 처리되도록 흐름을 구성하는 방법이 있습니까?

다음 코드는 내가 원했던 기능을 수행하지만 이상적으로 단일 IntegrationFlow에서이를 달성하는 더 쉽고/더 좋은 방법이 있는지 궁금합니다. : 그 trapException 옵션을 마지막 handle() 정의에

@Bean 
    public MessageChannel individualFlowInputChannel() { 
     return MessageChannels.direct().get(); 
    } 

    @Bean 
    public IntegrationFlow batchFlow() { 
     return f -> f 
      .split() 
      .handle(message -> { 
       try { 
        individualFlowInputChannel().send(message); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }); 
    } 

    @Bean 
    public IntegrationFlow individualFlow() { 
     return IntegrationFlows.from(individualFlowInputChannel()) 
      .handle((payload, headers) -> { 
       throw new RuntimeException("BOOM!"); 
      }).get(); 
    } 

답변

0

당신은 추가 할 수 있습니다 ExpressionEvaluatingRequestHandlerAdvice : 당신이 얘기하는 경우

/** 
* If true, any exception will be caught and null returned. 
* Default false. 
* @param trapException true to trap Exceptions. 
*/ 
public void setTrapException(boolean trapException) { 

다른 한편으로는, 더 나은되지 않을 것 "이메일을 보낸다" 각 분할 된 항목에 대해 별도의 스레드에서이를 수행 할 것을 고려해야합니까? 이 경우에 .split() 이후에 ExecutorChannel이 구출됩니다!

+1

감사합니다. Artem. 조언은'handle()'정의에만 적용됩니까? 난뿐만 아니라 모든 하위 구성 요소에서 예외에 대해 강력하고 싶습니다. 나는'ExecutorChannel' 접근법이 아마도 최선의 접근법이라는 것에 동의하며 앞으로 그것을 사용할 것을 고려할 것입니다. – DMurphy

+0

맞습니다.'ExpressionEvaluatingRequestHandlerAdvice'는 실제로'handleRequestMessage' (현재'AbstractReplyProducingMessageHandler'의 범위)에만 적용됩니다. 모든 다운 스트림 예외를 "트랩"하려면 자신의'HandleMessageAdvice'를 구현해야합니다. 그렇지 않은 경우는, 같은 thread 내의 모든 예외가 슬로우되어 정말로 다음의 분할 항목 처리를 정지합니다 –