我正在使用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]
答案 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所说的替代方案是使用交易监听器。