2016-12-01 49 views
0

我的环境:spring 4.1JBoss EAP 6.4IBM MQ 8.0春JMS消息重新传递工作不正常的CLIENT_ACKNOWLEDGE模式

消息未在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 Javadoc中:

为了始终如一地与任何容器的变体还船安排,考虑“CLIENT_ACKNOWLEDGE”模式或 - 优选 - 设定“sessionTransacted”为“真”,而不是

SO上有一个similar question

回答

0

将您的ack模式转换为Session.SESSION_TRANSACTED而不是CLIENT_ACKNOWLEDGE。

客户端确认模式不工作,因为大多数人都想要它..并且是JMS中常见的“陷阱”。它确认当前消息和会话中以前的所有消息。这不是每个消息的确认。

编辑:

还要检查post-- IBM MQ可能需要您使用的连接工厂类的“XA”版本有关。

裁判:Websphere Liberty profile - transacted Websphere MQ connection factory

+0

我曾尝试Session.SESSION_TRANSACTED,没有工作。 – kmansoor