【问题标题】:JMS on Websphere MQ and backout queueWebsphere MQ 上的 JMS 和回退队列
【发布时间】:2013-01-30 19:44:03
【问题描述】:

我将 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){
        // ...
    }

}

【问题讨论】:

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


    【解决方案1】:

    我是 EJB 的专家。但是从我在您的代码 sn-p 中可以看到,我认为您缺少 MessageDrivenContext 的初始化。我认为您将不得不这样做

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

    getMessageDrivenContext().setRollbackOnly();
    

    【讨论】:

    • weblogic.ejb.container.internal.MessageDrivenEJBContextImpl 在这里注入。但我会遵循这个线索,也许注入了错误的资源。还是谢谢!
    • 不走运。问题是在传递计数超过之后,消息被移动到回退队列并保持在那里未提交。因此,问题依然存在。
    • 你解决了吗? jms 客户端(本质上是您的 WMQ rar 存档)负责将消息传输到回退队列。在 JEE 中,这应该自动发生。当“doSomething”返回 false 时,尝试在侦听器中引发异常。检查您的 AS/事务管理器设置。