DefaultMessageListenerContainer,get sessionTransacted-property有效吗?

时间:2012-10-22 09:29:20

标签: java transactions jms spring-transactions spring-jms

如何进行,让DefaultMessageListenerContainer控制事务......据我所知,我只需要向DMLC提供sessionTransacted-property。如果出现一些错误,我的目标是将消息放回队列......

已经搜索了一段时间,但没有找到任何东西......

我的Spring-config(其中一部分):

<bean id="abstractMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" abstract="true">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="maxConcurrentConsumers" value="5"/>
    <property name="receiveTimeout" value="10000" />
</bean>

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer" parent="abstractMessageListenerContainer">
    <property name="destinationName" value="MY.QUEUE" />
    <property name="messageListener" ref="myMessageListener" />
            <property name="sessionTransacted" value="true" />
</bean>

<bean id="myMessageListener" class="my.package.structure.ListenerClass"></bean>

我的听众课程:

public class ListenerClass implements MessageListener {


    public void onMessage(Message msg) {


    }

}

只是抛出一个未经检查的异常(比如java.lang.IllegalStateException)?

2 个答案:

答案 0 :(得分:2)

如果将抛出未经检查的异常,

消息将回滚!不能抛出已检查的异常,因为它们未在MessageListener接口的onMessage方法的方法签名中提及。

答案 1 :(得分:-1)

你对sessionTransacted的假设是正确的,如果在侦听器中任何失败的情况下设置为true,则消息将被回滚 - 这基本上意味着消息将返回到队列中以便重试。通常,代理允许的重试次数有限制,如果超过阈值,则消息将以DLQ(死信队列)结束。