Websphere MQ和回退队列上的JMS

时间:2013-01-29 12:06:29

标签: jms java-ee-6 ibm-mq message-driven-bean weblogic12c

我在我的Weblogic服务器上将MQ作为外部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){
        // ...
    }

}

1 个答案:

答案 0 :(得分:1)

我是EJB中的tyro。但是从我在代码片段中看到的内容来看,我认为您缺少MessageDrivenContext的初始化。我想你必须做任何一件事

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

getMessageDrivenContext().setRollbackOnly();