流程如下:
<int:channel id="myapp.input">
<int:queue/>
</int:channel>
<int:channel id="myapp.output">
<int:queue/>
</int:channel>
<int:chain input-channel="myapp.input" output-channel="myapp.output">
<int:poller error-channel="baseFlow.error">
<int:transactional/>
</int:poller>
<int:service-activator ref="jmsService1"/>
<int:service-activator ref="dbService2"/>
<int:service-activator ref="jmsService2"/>
<int:service-activator ref="dbService2"/>
</int:chain>
现在在链的末尾,在向output-channel
'myapp.output'发送消息之前,交易已经完成,并且会抛出DataAccessException
。
理想的行为是,在我的errorChannel
中,我得到的MessagingException
包含failedMessage
和DataAccessException
。
实际行为是我在我的DataAccessException
中获得了errorChannel
,但我不知道哪条消息,我无法做出反应。
有没有办法达到预期的行为?
答案 0 :(得分:1)
有趣 - 这是网关的正常行为。
通常,网关用于从java代码调用集成流,并且消息传递异常被解包,因此调用者获得实际异常。
但是,在此上下文中使用网关(从其他某个消息传递组件调用)时,我可以看到网关应该重新抛出MessagingException
。我们将自动考虑这样做。
与此同时......
默认service-interface
为RequestReplyExchanger
。
如果您创建自己的RequestReplyExchanger
版本并将throws MessagingException
添加到exchange()
方法,并在您的网关中使用它,网关应该重新抛出该异常而不是展开它
我打开了JIRA Issue。
修改强>
您可以使用嵌套网关来解决问题;从轮询器中删除事务和错误通道,而是在第二个网关启动事务;当提交失败时,消息传递异常将被发送到第一个通道的错误通道...
public interface TxGateway {
@Transactional
Message<?> exchange(Message<?> message);
}
<tx:annotation-driven/>
<int:service-activator ref="errorHandlingGW" input-channel="one">
<int:poller ... />
</int:service-activator>
<int:gateway id="errorHandlingGW" default-request-channel="two" error-channel="two" />
<int:service-activator ref="transactionalGW" input-channel="two" />
<int:gateway id="transactionalGW" service-interface="my.TxGateway" default-request-channel="chain1" />