异常时未回滚weblogic JMS队列消息

异常时未回滚weblogic JMS队列消息,jms,weblogic-10.x,spring-jms,Jms,Weblogic 10.x,Spring Jms,我们在上面设置了weblogic10.3.4和JMS队列,下面是消息侦听器代码,它使用SpringJMS,MessageProducer设置为ClientAcknowledgeMode。当出现异常时,消息仍然会移出队列并回滚,下面的代码有什么问题吗 public class EmailListener implements MessageListener,ExceptionListener{ private EmailSend emailSend; @Suppress

我们在上面设置了weblogic10.3.4和JMS队列,下面是消息侦听器代码,它使用SpringJMS,MessageProducer设置为ClientAcknowledgeMode。当出现异常时,消息仍然会移出队列并回滚,下面的代码有什么问题吗

public class EmailListener implements MessageListener,ExceptionListener{



    private EmailSend emailSend;



    @SuppressWarnings("unchecked")
    public void onMessage(Message message){
        ObjectMessage om ;
        try {
            if(message instanceof ObjectMessage) {
                om = (ObjectMessage)message;
                emailSend.sendEmail((Map<String, String>)om.getObject());
                //throw new JMSException("Test");
                 om.acknowledge();

            }
        }
        catch(MailException me) {
            logger.error("Mail server exception in sending email",me);
            throw new RuntimeException(me);
        }catch(JMSException jmse) {
            logger.error("Error in sending email",jmse);
            throw new RuntimeException(jmse);

        }

    }

    public void setEmailSend(EmailSend emailSend){
        this.emailSend = emailSend;
    }

    public void onException(JMSException jmse){
        logger.error("Exception in sending email",jmse);

    }
    public void acknowledge(
    ) throws JMSException{

    }
}
下面是Spring配置

<!--Spring JMS Message Listener Container -->
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer"
        p:autoStartup="true" p:destination-ref="queue"
        p:destinationResolver-ref="jmsDestinationResolver"
        p:connectionFactory-ref="authenticationConnectionFactory"
        p:exceptionListener-ref="emailListener"
        p:messageListener-ref="emailListener" />

你需要澄清一下。标题表示您的消息没有按应有的方式回滚到队列,而帖子中的文本表示消息已回滚

尽管如此,还是有几点建议可以帮助您纠正回滚行为:

不要依赖于承认。事实上,它们并不打算成为应用程序逻辑级的重新交付。你可以读一些关于它的细节。所以,acks不会在异常情况下让您重新交付,但事务会

您可以在DMLC上设置p:sessionTransact=true。这可能就是您想要的——如果您遇到异常,消息将回滚到队列

如果您开始在其中包括数据库连接,那么您可能应该从WebLogic JNDI存储库中获取Jta事务管理器,并将其作为p:transactionManager属性注入DMLC,因为会话事务只支持一个资源事务