Моя программа выполняет следующие действия на высоком уровне
Task 1
get the data from the System X
the Java DSL split
post the data to the System Y
post the reply data to the X
the Java DSL aggregate
Task 2
get the data from the System X
the Java DSL split
post the data to the System Y
post the reply data to the X
the Java DSL aggregate
...
Проблема заключается в том, что при сбое одной подзадачи post the data to the System Y
сообщение об ошибке корректно отправляется обратно в System X, но после этого любоедругие подзадачи или задачи не выполняются.
Мой обработчик ошибок делает это:
...
Message<String> newMessage = MessageBuilder.withPayload("error occurred")
.copyHeadersIfAbsent(message.getPayload().getFailedMessage().getHeaders()).build();
...
Set some extra headers etc.
...
return newMessage;
В чем может быть проблема?
Редактировать:
Я отладил Spring Integration.В ситуации ошибки только первое сообщение об ошибке приходит к методу AbstractCorrelatingMessageHandler.handleMessageInternal
.Другие успешные и неуспешные сообщения не поступают в метод.
Если ошибок нет, все сообщения приходят в метод и, наконец, группа освобождается.
Что может быть не так в моей программе?
Редактировать 2:
Это работает:
Добавлены advice
для Http.outboundGateway
:
.handle(Http.outboundGateway(...,
c -> c.advice(myAdvice()))
и myAdvice
bean
@Bean
private Advice myAdvice() {
return new MyAdvice();
}
иMyAdvice
класс
public class MyAdvice<T> extends AbstractRequestHandlerAdvice {
@SuppressWarnings("unchecked")
@Override
protected Object doInvoke(final ExecutionCallback callback, final Object target, final Message<?> message)
throws Exception {
...
try {
result = (MessageBuilder<T>) callback.execute();
} catch (final MessageHandlingException e) {
take the exception cause for the new payload
}
return new message with the old headers and replyChannel header and result.payload or the exception cause as a payload
}
}