Spring Integration Java DSL:如何在发生错误情况后继续使用split和聚合方法继续?

时间:2018-11-23 10:14:10

标签: spring-integration spring-integration-dsl

我的程序高水平地执行以下操作

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

}

1 个答案:

答案 0 :(得分:1)

您的程序没有任何问题。这正是Java中常规循环的工作方式。要捕获每次迭代的异常并继续执行其他剩余项,您在Java循环中肯定需要try..catch。因此,您需要在此处为​​拆分器应用类似的内容。可以使用ExpressionEvaluatingRequestHandlerAdviceExectutorChannel作为拆分器的输出,也可以通过拆分器输出通道上的服务激活器通过网关调用来实现。

由于故事是关于聚合器的,所以您仍然需要以某种方式完成一个小组,这只能通过从错误处理中发出的错误补偿消息来完成,然后返回到聚合器的输入通道。在这种情况下,您需要确保将请求标头从抛出的failedMessage的{​​{1}}复制到错误流。汇总组后,您将需要将错误的消息与正常消息分开。只有使用特殊的有效负载才能做到这一点,或者您可能只是一个例外,因为它是聚合器最终结果中与正常消息正确区分错误的有效负载。