之前似乎有很多关于这方面的问题,大多是关于旧的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
添加到轮询器,来自该通道的下游流将获得具有failedMessage
和cause
属性的MessagingException
类型有效载荷的ErrorMessage
。ErrorMessage
还具有原始消息属性。
或者,您可以将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-建议