Springs onMessage处理程序的事务支持

时间:2012-02-07 16:04:07

标签: java spring jms jta spring-jms

所以我有一些样板代码消耗来自主题的消息:

    public void onMessage(Message message )
{
    try
    {
        // try my conversion
    }
    catch(MyConversionException e)
    {
        //catch conversion error but still consume off topic
    }

    //Any other error i.e. runtime errors will not cause the message to be consumed from topic. So it can be retried

}

我希望能够尝试将邮件转换为另一个对象。如果这导致错误,我会用自己的异常处理捕获它并将其写入错误队列。

我的问题是,如何将Springs messageListenerContainer bean设置为Transactional,并且只有在成功发生时才会消耗???

[编辑] 到目前为止,这是豆子:

    <!-- MESSAGE LISTENER CONTAINER -->
<bean id="ListenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="messageListener" ref="MessageListener" />
    <property name="connectionFactory" ref="Tcf" />
    <property name="destinationResolver" ref="JmsDestinationResolver" />
    <property name="receiveTimeout" value="${jms-timeout}" />
    <property name="destinationName" value="${jms-topic}" />
    <property name="concurrency" value="1" />
    <property name="pubSubDomain" value="true" />
    <property name="subscriptionDurable" value="${jms-durable-flag}"/>
    <property name="durableSubscriptionName" value="${jms-durable-name}" />
    <property name="clientId" value="${jms-client-id}"/>
</bean> 

1 个答案:

答案 0 :(得分:-1)

不建议这样做,但您可以调用TransactionStatus.setRollbackOnly()。

另外你可能想要考虑与事务模型保持一致,如果你想要回滚,那么通过异常来做...在这种情况下......你需要抛出一个RuntimeException,以便Spring回滚消息,如果你捕获异常并且只记录它,Spring就不知道出了什么问题......