非事务异步JMS使用者 - Auto_Acknowledge - 消息不返回队列

时间:2013-11-19 16:35:20

标签: jms weblogic12c

我正在使用Weblogic 12,而且我有一个非事务处理的异步JMS使用者。 我没有设置ack模式,所以它默认为AUTO_ACKNOWLEDGE。我已经证实了 这在应用程序中..见下文。

我所做的是使用消息,然后调用exit退出。

我希望在此消费者拥有后,JMS消息将在队列中 运行,因为在onMessage完全完成之前不应确认消息。

而是Weblogic JMS队列中不再存在该消息。 任何想法为什么不???

请参阅下文,了解我的onMessage代码和应用程​​序的输出。

感谢您的帮助。

这是我的代码

@Override
public void onMessage(Message message, Session session) throws JMSException {

    logger.info("Session : Ack Mode    : " + convertSamToString(session.getAcknowledgeMode()));
    logger.info("Session : Transacted? : " +  session.getTransacted());

    try {
        String msgText;
        if (message instanceof TextMessage) {
            msgText = ((TextMessage) message).getText();
        } else {
            msgText = message.toString();
            messages.add(msgText);
        }

        logger.info("<Msg_Receiver> [" + msgText + "]");

        if (true)
            System.exit(2);
               // throw new RuntimeException("Exception during message consumption.");

    } catch (JMSException jmsEx) {
        logger.error("JMS Exception: ", jmsEx);
        throw new RuntimeException(jmsEx);
    }

    logger.info("Finished processing message.");
}

这是输出:

19 Nov 2013 16:24:26,079  INFO JmsConsumerApp - JmsConsumerApp starting.
19 Nov 2013 16:24:26,125  INFO ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@19616c7: startup date [Tue Nov 19 16:24:26 GMT 2013]; root of context hierarchy
19 Nov 2013 16:24:26,172  INFO XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [jmsConsumer-applicationContext.xml]
19 Nov 2013 16:24:26,360  INFO PropertyPlaceholderConfigurer - Loading properties file from class path resource [jms.properties]
19 Nov 2013 16:24:26,360  INFO DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8acf6e: defining beans [org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor#0,jmsconfig,jndiTemplate,connectionFactory,jmsTransactionManager,paymentQueue,jmsConsumer,jmsConsumer1,jmsProducerListenerContainer1]; root of factory hierarchy
19 Nov 2013 16:24:26,750  INFO DefaultLifecycleProcessor - Starting beans in phase 2147483647
19 Nov 2013 16:26:22,433  INFO JmsMessageConsumer1 - Session : Ack Mode    : AUTO_ACKNOWLEDGE
19 Nov 2013 16:26:22,433  INFO JmsMessageConsumer1 - Session : Transacted? : false
19 Nov 2013 16:26:22,433  INFO JmsMessageConsumer1 - <Msg_Receiver> [MyJMStestMessage]

2 个答案:

答案 0 :(得分:1)

自动确认意味着一旦到达 onMessage 方法的代码行1,就会认为该消息已被传递(或者在技术上,我认为,在此之前,当它处理管理消息的容器时监听器)。因此,无论接下来发生什么,服务器都会认为消息消失了。

我不确定您想要什么行为,但如果您正在寻找更精细的控制,您可以使用交易消息,或者您可以使用已确认的客户端。

答案 1 :(得分:1)

我已经查看了JMS 1.1规范,我看到以下文本(来自4.4.11):

AUTO_ACKNOWLEDGE - With this option, the session automatically
acknowledges a client’s receipt of a message when it has either successfully
returned from a call to receive or the MessageListener it has called to process
the message successfully returns.

我最初的问题并不明显,我使用的是设计用于交易的Spring DefaultMessageListenerContainer。如果未在事务中使用,它将在接收时和处理之前立即收到消息(上述第一个AUTO_ACK行为)。

我将spring配置更改为使用jms侦听器容器SimpleMessageListenerContainer,并且在消息完全处理完之后才会发送ack。完美。

Nicholas所说的替代方案是使用交易监听器。