使用直接通道处理消息拆分器后的错误
Handling errors after a message splitter with direct channels
我正在开发一项使用 spring 集成 java dsl 发送电子邮件的服务。
我有一个批处理消息,它被拆分为一系列单独的消息,这些消息将变成电子邮件。
我遇到的问题是,如果其中一条消息出现错误,则批处理中的其他消息不会得到处理。
有没有办法配置流程,以便在消息抛出异常时,异常得到妥善处理并处理批处理中的下一条消息?
以下代码实现了我想要的功能,但我想知道是否有更简单/更好的方法来实现此目的,最好是在单个 IntegrationFlow 中? :
@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();
}
您可以将 ExpressionEvaluatingRequestHandlerAdvice
添加到最后一个 handle()
定义及其 trapException
选项:
/**
* If true, any exception will be caught and null returned.
* Default false.
* @param trapException true to trap Exceptions.
*/
public void setTrapException(boolean trapException) {
另一方面,如果您在谈论 "sends emails",考虑在每个拆分项目的单独线程中执行此操作不是更好吗?在这种情况下,.split()
之后的 ExecutorChannel
就派上用场了!
我正在开发一项使用 spring 集成 java dsl 发送电子邮件的服务。
我有一个批处理消息,它被拆分为一系列单独的消息,这些消息将变成电子邮件。
我遇到的问题是,如果其中一条消息出现错误,则批处理中的其他消息不会得到处理。
有没有办法配置流程,以便在消息抛出异常时,异常得到妥善处理并处理批处理中的下一条消息?
以下代码实现了我想要的功能,但我想知道是否有更简单/更好的方法来实现此目的,最好是在单个 IntegrationFlow 中? :
@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();
}
您可以将 ExpressionEvaluatingRequestHandlerAdvice
添加到最后一个 handle()
定义及其 trapException
选项:
/**
* If true, any exception will be caught and null returned.
* Default false.
* @param trapException true to trap Exceptions.
*/
public void setTrapException(boolean trapException) {
另一方面,如果您在谈论 "sends emails",考虑在每个拆分项目的单独线程中执行此操作不是更好吗?在这种情况下,.split()
之后的 ExecutorChannel
就派上用场了!