Spring集成JDBCMessageHandler错误处理策略



之前似乎有很多关于这方面的问题,大多是关于旧的Spring论坛的冷链接。

以下是我试图从捕获异常/错误的子流

return flowDef
.filter(getFilterExpression(rule)).channel(new DirectChannel())
.handle(inboundAdapter)
.split(insertDeleteSplitter)
.publishSubscribeChannel(c -> 
c.subscribe(s -> s
.filter ("....")
.transform(genericTransformer)
.handle(insertUpdateMessageHandler(rule))) // a JDBCMessageHandler
.subscribe(s -> s
.filter("....")
.transform(genericTransformer)
.handle(deleteMessageHandler(rule))) // a JDBCMessageHandler
.subscribe(sub -> sub
.handle(cleanupMessageHandler(rule))) // a JDBCMessageHandler
//                  .errorHandler(new CustomErrorHandler()); // Obviously not working
);

我看到的症状是错误会传播回轮询器,而轮询器没有解决问题所需的详细信息。

我的意图是,任何异常或错误都将被捕获,并从消息完成的子流级别重新路由到错误流,该错误流由记录故障的代码和核心数据组成,然后完成清理。

  • 启动条件:消息ABC已正确路由到此子流
  • 消息ABC已被拆分并路由到(例如(insertUpdateMessageHandler(JDBCMessageHandler(
  • 处理失败-数据库服务器抛出重复行(例如(

实际结果:

  • 轮询器捕获异常,它没有记录/处理错误所需的信息

期望结果:

  • 在这个级别处理异常,流结束

我的怀疑:

  • 理想情况下,我犯了一个简单的打字错误,当它被指出时,我会觉得自己像个傻瓜
  • 我怀疑这是一种设计考虑,目的是使轮询器成为错误或处理的级别,可能是为了事务性
  • 我可能需要将异常处理构建到自定义消息处理程序中,这些消息处理程序包装JDBC消息处理程序,然后处理异常

(编辑(另请参阅:如何配置此JdbcMessageHandler以从消息中提取参数,而不是静态bean?

不清楚你说的"民意测验者没有必要的信息&";。

您可以将errorChannel添加到轮询器,来自该通道的下游流将获得具有failedMessagecause属性的MessagingException类型有效载荷的ErrorMessageErrorMessage还具有原始消息属性。

或者,您可以将ExpressionEvaluatingRequestHandlerAdvice添加到适配器端点的建议链中。

请参阅https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#message-操作员建议链

https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#expression-建议

最新更新