非事务异步JMS使用者-自动确认-消息不返回队列

非事务异步JMS使用者-自动确认-消息不返回队列,jms,weblogic12c,Jms,Weblogic12c,我使用的是Weblogic 12,我有一个非事务异步JMS使用者。 我没有设置ack模式,因此它默认为自动确认。我已经确认了 这在应用程序中很常见。。见下文 我所做的是使用消息,然后调用exit退出 我希望JMS消息在这个使用者完成后会出现在队列上 在onMessage完全完成之前,不应确认消息运行方式 相反,消息不再存在于Weblogic JMS队列中。 有什么想法吗 请参阅下面的onMessage代码和应用程序的输出 谢谢你的帮助 这是我的密码 @Override public void o

我使用的是Weblogic 12,我有一个非事务异步JMS使用者。 我没有设置ack模式,因此它默认为自动确认。我已经确认了 这在应用程序中很常见。。见下文

我所做的是使用消息,然后调用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.");
}
@覆盖
public void onMessage(消息消息、会话会话)引发JMSException{
info(“会话:确认模式:”+convertSamToString(Session.getAcknowledgeMode()));
logger.info(“Session:transact?:”+Session.getTransact());
试一试{
字符串msgText;
如果(文本消息的消息实例){
msgText=((TextMessage)message.getText();
}否则{
msgText=message.toString();
messages.add(msgText);
}
logger.info(“[”+msgText+“]);
如果(真)
系统出口(2);
//抛出新的RuntimeException(“消息使用期间异常”);
}捕获(jmsEx异常jmsEx){
logger.error(“JMS异常:”,jmsEx);
抛出新的运行时异常(jmsEx);
}
logger.info(“已完成处理消息”);
}
以下是输出:

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]
2013年11月19日16:24:26079信息JmsConsumerApp-JmsConsumerApp正在启动。
2013年11月19日16:24:26125信息类路径XMLApplicationContext-刷新org.springframework.context.support。ClassPathXmlApplicationContext@19616c7:启动日期[2013年11月19日星期二16:24:26 GMT];上下文层次结构的根
2013年11月19日16:24:26172信息XmlBeanDefinitionReader-从类路径资源[jmsConsumer applicationContext.XML]加载XMLBean定义
2013年11月19日16:24:26360信息属性PlaceHolderConfigure-从类路径资源[jms.properties]加载属性文件
2013年11月19日16:24:26360信息DefaultListableBeanFactory-在org.springframework.beans.factory.support中预实例化单例。DefaultListableBeanFactory@8acf6e:定义bean[org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor#0、jmsconfig、JNDemplate、connectionFactory、jmsTransactionManager、paymentQueue、jmsConsumer、jmsConsumer1、jmsProducerListenerContainer1];工厂层次结构的根
2013年11月19日16:24:26750信息DefaultLifecycleProcessor-在阶段2147483647中启动bean
2013年11月19日16:26:22433信息JmsMessageConsumer1-会话:确认模式:自动确认
2013年11月19日16:26:22433信息JmsMessageConsumer1-会话:已处理?:false
2013年11月19日16:26:22433信息JmsMessageConsumer1-[MyJMStestMessage]

自动确认意味着只要点击您的onMessage方法的第1行代码(或者在技术上,我认为,在此之前,当它加热管理消息侦听器的容器时),消息就被视为已发送。因此,不管接下来发生什么,服务器都会认为消息已丢失


我不确定您想要什么行为,但如果您想要更细粒度的控制,您可以通过事务处理消息获得它,或者您可以使用客户端确认。

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

从我最初的问题中不明显的是,我使用的是Spring,它被设计用于事务。当事务中没有使用它时,它会在收到消息时和处理之前立即确认消息(上面描述的第一个自动确认行为)

我将spring配置更改为使用jms侦听器容器,直到消息被完全处理之后才会发送ack。非常好


正如Nicholas所说的,另一种方法是使用事务侦听器。

当我在事务中运行上述内容时,它可以正常工作。但在非事务会话中,我希望它可以正常工作。
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.