Spring integration 入站通道适配器-失败时如何更新行字段?

Spring integration 入站通道适配器-失败时如何更新行字段?,spring-integration,spring-jdbc,Spring Integration,Spring Jdbc,我有一个从标准数据库查询开始的集成,它会更新数据库中的状态,以表明集成工作正常。它起作用了 但是,如果无法处理数据并引发异常,则不会按预期更新状态,但我希望使用“KO”状态更新数据库行,以便同一行不会反复出现故障 有没有办法在集成失败时提供第二个查询来执行 在我看来,这是一种非常标准的做事方式,但我找不到一种简单的方式。我可以在集成的每个步骤中捕获异常并更新数据库,但它会产生耦合,所以应该有另一个解决方案 我尝试了很多谷歌搜索,但我什么也找不到,但我很确定答案就在那里 以防万一,有我的xml配置

我有一个从标准数据库查询开始的集成,它会更新数据库中的状态,以表明集成工作正常。它起作用了

但是,如果无法处理数据并引发异常,则不会按预期更新状态,但我希望使用“KO”状态更新数据库行,以便同一行不会反复出现故障

有没有办法在集成失败时提供第二个查询来执行

在我看来,这是一种非常标准的做事方式,但我找不到一种简单的方式。我可以在集成的每个步骤中捕获异常并更新数据库,但它会产生耦合,所以应该有另一个解决方案

我尝试了很多谷歌搜索,但我什么也找不到,但我很确定答案就在那里

以防万一,有我的xml配置来执行数据库查询(没什么特别的):



我使用的是spring integration 4.0.0版。发布版

因为您在事务中,这是正常的行为,导致回调,并且您的数据库返回到清除状态

在这种情况下,从应用程序中获取数据处理是一种经典模式,而不是从一些内置工具。这就是为什么我们在错误更新时不提供任何
,因为它不能成为evrything的用例

不过,只要您要更新行,就应该在
onRallback
事件中执行某些操作,并在新事务中执行。但是,它应该在同一个线程中,以防止从第二个轮询任务获取同一行

为此,我们提供了
事务同步工厂
功能:



希望我很清楚

谢谢您的快速回复,是的,您很清楚。我对此进行了设置,但似乎该参数没有保留在入站通道适配器和出站通道适配器之间。在NamedParameterUtils#buildValueArray方法的调试模式下,参数paramSource包含一个空映射。OK。您是否介意调试
JdbcMessageHandler#handleMessageInternal
并查看消息如何查找```?对不起,没有机会从代码中检查它。但是,您可能应该使用
:payload[id]
,因为在这种情况下,根对象是
消息
,而不是它的
负载
,因为它正在更新
入站适配器
?我不介意帮助您帮助我在消息中,我确实有来自rowMapper的bean,它确实包含正确的值。很好。那我是对的。因此,只需借助您的
更新
表达式来使用该
有效负载中的正确值
。我已经更新了我的答案以显示
(:payload[id])
是的,我们就快到了,我不得不使用:payload[0]。数组中确实有一个对象,但它的类型似乎不正确,我的列类型无效。我的java字段是int,列的类型是NUMBER(oracle)。
<int-jdbc:inbound-channel-adapter auto-startup="true" data-source="datasource"
            query="select * FROM MyTable  where STATE='ToProcess')"
            channel="stuffTransformerChannel"
            update="UPDATE MyTable SET STATE='OK' where id in (:id)"
            row-mapper="myRowMapper" max-rows-per-poll="1">
            <int:poller fixed-rate="1000">
                <int:transactional />
            </int:poller>
</int-jdbc:inbound-channel-adapter>