【问题标题】:DefaultMessageListenerContainer, get sessionTransacted-property working?DefaultMessageListenerContainer,让 sessionTransacted-property 工作?
【发布时间】:2012-10-22 09:29:20
【问题描述】:

进展如何,让 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)?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您对sessionTransacted 的假设是正确的,如果设置为 true 以防侦听器发生任何故障,则消息将回滚 - 这基本上意味着消息将返回队列中以进行重试。通常,代理允许的重试次数是有限制的,如果超过阈值,消息将最终进入 DLQ(死信队列)。

      【讨论】:

      • 由于 onMessage(Message arg0) 不允许抛出任何已检查的异常,我必须抛出 UncheckedException,对吧?
      • 任何异常都应该回滚事务 - 未经检查或检查,怀疑它是否特定于运行时异常
      • 检查的异常必须在方法签名中提及,或者?否则他的 javac 会失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多