Websphere MQ和回退队列上的JMS

Websphere MQ和回退队列上的JMS,jms,java-ee-6,ibm-mq,message-driven-bean,weblogic12c,Jms,Java Ee 6,Ibm Mq,Message Driven Bean,Weblogic12c,我将MQ作为Weblogic服务器上的外部JMS服务器。问题是,我需要回滚消息并重试,直到达到回退阈值。然后我需要将消息移动到回退队列 MessageDrivenContext.setRollbackOnly()方法很好地解决了这个问题。但是,问题在于回退队列上的消息—它是未限制的 此外,消息将从回退队列中获取,并在新消息出现在主队列上时再次进行处理 这表明我的方法有一些明显的错误。但是,我无法改变这样一个事实,即当达到回退阈值时,我必须用同一条消息重试onMessage()几次并将其发送到回退

我将MQ作为Weblogic服务器上的外部JMS服务器。问题是,我需要回滚消息并重试,直到达到回退阈值。然后我需要将消息移动到回退队列

MessageDrivenContext.setRollbackOnly()方法很好地解决了这个问题。但是,问题在于回退队列上的消息—它是未限制的

此外,消息将从回退队列中获取,并在新消息出现在主队列上时再次进行处理

这表明我的方法有一些明显的错误。但是,我无法改变这样一个事实,即当达到回退阈值时,我必须用同一条消息重试onMessage()几次并将其发送到回退队列

@MessageDriven( name="MQListener", mappedName = "jms.mq.SOME.QUEUE.NAME",
        activationConfig = 
        { 
            @ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms.mq.SOME.QUEUE.NAME"),
            @ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms.mq.MQ"),
            @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true")
        }) 
public class MQListener implements MessageListener {
    @Resource
    private MessageDrivenContext context;

    @Override
    public void onMessage(Message message) {
        String messageContent="";

        try {
            messageId = message.getJMSMessageID();
            if (message != null) {
                messageContent = ((TextMessage)message).getText();
                if(!doSomething(messageContent)){
                    // doSomething fails, I need to rollback the message and try again:
                    context.setRollbackOnly();
                }
            }
        } catch (Exception e) {
            throw new RuntimeException();
        }

    }

    private boolean doSomething(String messageContent){
        // ...
    }

}

我是EJB中的泰罗人。但从您的代码片段中可以看到,我认为您缺少了
MessageDrivenContext
的初始化。我想你也得这样做

context = getMessageDrivenContext(); 
context.setRollbackOnly();


这里注入了weblogic.ejb.container.internal.MessageDrivenEJBContextImpl。但我会遵循这条线索,也许注入了错误的资源。无论如何谢谢你!不走运。问题是,在传递计数超过后,消息将被移动到回退队列并保持未提交状态。所以问题还是存在的,你解决了吗?jms客户机(本质上是您的WMQ rar归档)负责将消息传输到回退队列。在JEE中,这应该自动发生。当“doSomething”返回false时,尝试在侦听器中引发异常。检查您的AS/Transaction Manager设置。
getMessageDrivenContext().setRollbackOnly();