我的程序高水平地执行以下操作
post the data to the System Y
问题在于,当一个...
Message<String> newMessage = MessageBuilder.withPayload("error occurred")
.copyHeadersIfAbsent(message.getPayload().getFailedMessage().getHeaders()).build();
...
Set some extra headers etc.
...
return newMessage;
子任务失败时,错误消息将正确地发送回System X,但是此后,其他任何子任务或任务均未执行。
我的错误处理程序会这样做:
AbstractCorrelatingMessageHandler.handleMessageInternal
可能是什么问题?
编辑:
我调试了Spring Integration。在错误情况下,方法advice
仅出现第一条错误消息。其他成功和失败的消息不会出现在该方法中。
如果没有错误,所有消息都会传到方法中,最后释放该组。
我的程序可能出什么问题了?
编辑2:
这有效:
为Http.outboundGateway
添加了.handle(Http.outboundGateway(...,
c -> c.advice(myAdvice()))
:
myAdvice
和@Bean
private Advice myAdvice() {
return new MyAdvice();
}
bean
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
}
类
Aggregate
}
答案 0 :(得分:1)
您的程序没有任何问题。这正是Java中常规循环的工作方式。要捕获每次迭代的异常并继续执行其他剩余项,您在Java循环中肯定需要try..catch
。因此,您需要在此处为拆分器应用类似的内容。可以使用ExpressionEvaluatingRequestHandlerAdvice
,ExectutorChannel
作为拆分器的输出,也可以通过拆分器输出通道上的服务激活器通过网关调用来实现。
由于故事是关于聚合器的,所以您仍然需要以某种方式完成一个小组,这只能通过从错误处理中发出的错误补偿消息来完成,然后返回到聚合器的输入通道。在这种情况下,您需要确保将请求标头从抛出的failedMessage
的{{1}}复制到错误流。汇总组后,您将需要将错误的消息与正常消息分开。只有使用特殊的有效负载才能做到这一点,或者您可能只是一个例外,因为它是聚合器最终结果中与正常消息正确区分错误的有效负载。