【问题标题】:Spring JMS Message Redelivery not working as expected for CLIENT_ACKNOWLEDGE mode对于 CLIENT_ACKNOWLEDGE 模式,Spring JMS 消息重新传递未按预期工作
【发布时间】:2017-04-16 15:59:26
【问题描述】:

我的环境:spring 4.1JBoss EAP 6.4IBM MQ 8.0

Listener 抛出RuntimeException 的情况下不会重新传递消息。

我在JmsConfig中有以下内容:

@Bean
DefaultMessageListenerContainer defaultMessageListenerContainer(QueueConnectionFactory connectionFactory, JndiDestinationResolver dr, MessageListener ml) {
    DefaultMessageListenerContainer mlc = new DefaultMessageListenerContainer();
    mlc.setConnectionFactory(connectionFactory);
    mlc.setMessageListener(ml);
    mlc.setDestinationName(jndiInQueue);
    mlc.setDestinationResolver(dr);
    mlc.setSessionTransacted(true);
    mlc.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return mlc;
}

如果我使用JmsTransactionManager 并将其传递给上述方法并像这样使用:

mlc.setTransactionManager(tm)

以下警告被写入日志:

It is not valid to commit a non-transacted session,行为相同,不重发。

ConnectionFactory是通过JNDI获取的,不知通过jndi获取ConnectionFactory是否与此有关?

来自AbstractMessageListenerContainer Javadocs:

为了始终如一地安排任何容器变体的重新交付,请考虑“CLIENT_ACKNOWLEDGE”模式或 - 最好 - 将“sessionTransacted”设置为“true”

在 SO 上有一个similar question

【问题讨论】:

    标签: spring jms jndi ibm-mq spring-jms


    【解决方案1】:

    将确认模式转换为 Session.SESSION_TRANSACTED 而不是 CLIENT_ACKNOWLEDGE。

    Client Ack 模式并不像大多数人想要的那样工作。它是 JMS 中常见的“陷阱”。它确认当前消息和会话中的所有先前消息。这不是每个消息的确认。

    编辑:

    同时查看相关帖子——IBM MQ 可能要求您使用连接工厂类的“XA”版本。

    参考:Websphere Liberty profile - transacted Websphere MQ connection factory

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2020-03-29
      • 2011-03-27
      • 1970-01-01
      • 2011-02-28
      • 2012-11-10
      • 2015-01-09
      相关资源
      最近更新 更多