DataAccessException未包装在MessagingException中

时间:2016-08-23 09:29:09

标签: spring-integration

这是this post

的后续问题

流程如下:

<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包含failedMessageDataAccessException

实际行为是我在我的DataAccessException中获得了errorChannel,但我不知道哪条消息,我无法做出反应。

有没有办法达到预期的行为?

1 个答案:

答案 0 :(得分:1)

有趣 - 这是网关的正常行为。

通常,网关用于从java代码调用集成流,并且消息传递异常被解包,因此调用者获得实际异常。

但是,在此上下文中使用网关(从其他某个消息传递组件调用)时,我可以看到网关应该重新抛出MessagingException。我们将自动考虑这样做。

与此同时......

默认service-interfaceRequestReplyExchanger

如果您创建自己的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" />