저는 스프링 통합 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();
}
감사합니다. Artem. 조언은'handle()'정의에만 적용됩니까? 난뿐만 아니라 모든 하위 구성 요소에서 예외에 대해 강력하고 싶습니다. 나는'ExecutorChannel' 접근법이 아마도 최선의 접근법이라는 것에 동의하며 앞으로 그것을 사용할 것을 고려할 것입니다. – DMurphy
맞습니다.'ExpressionEvaluatingRequestHandlerAdvice'는 실제로'handleRequestMessage' (현재'AbstractReplyProducingMessageHandler'의 범위)에만 적용됩니다. 모든 다운 스트림 예외를 "트랩"하려면 자신의'HandleMessageAdvice'를 구현해야합니다. 그렇지 않은 경우는, 같은 thread 내의 모든 예외가 슬로우되어 정말로 다음의 분할 항목 처리를 정지합니다 –