从mq 7.0版迁移到7.5版

时间:2015-01-16 04:08:23

标签: java java-ee jms ibm-mq weblogic11g

我正在从Mq 7.0版迁移到7.5版。我可以使用ejb - 消息驱动Bean(MDB)通过入站队列接收消息,但是在处理完消息之后发布消息。我收到IBM MQRC 2082 MQRC_UNKOWN_ALIAS_BASE_Q异常。

这是我得到的例外:

  

引起:javax.jms.InvalidDestinationException:MQJMS2008:失败了   打开MQ队列'OFS.TIG​​_IND2NSE_MSG'。           at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getQueueOpenException(MQQueueServices.java:901)           在com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getOutputQueue(MQQueueServices.java:727)           在com.ibm.msg.client.wmq.v6.jms.internal.JMSServicesMgr.getOutputQueue(JMSServicesMgr.java:210)           在com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createQProducer(MQSession.java:3138)           在com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2863)           在com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2920)           在com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1191)           在com.ibm.msg.client.jms.internal.JmsXAQueueSessionImpl $ 1.createSender(JmsXAQueueSessionImpl.java:415)           在com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:148)           在weblogic.deployment.jms.WrappedSession.createSender(WrappedSession.java:344)           在com.tiger.gmfs.framework.jms.QUtil.getSender(QUtil.java:216)           在com.tiger.gmfs.framework.jms.QUtil.sendMessage(QUtil.java:110)

我写的代码是: 这是我的getSender方法: protected QueueSender getSender()抛出JavaMessagingException,             JMSException {

    QueueSender sender = null;
    queue = qsess.createQueue(qVO.getName());
    sender =  qsess.createSender(queue);
    if (sender == null)
        throw new JavaMessagingException("The queue sender is null.");


    sender.setPriority(qVO.getPriority());
    return sender;
}

这是我的sendMessage方法:

public void sendMessage(Message jmsMessage) throws JavaMessagingException,
            JMSException {
        QueueSender sender = null;
        try {
            sender = getSender();
            sender.send(jmsMessage);
        } catch (JMSException j) {
            Exception l = j.getLinkedException();
            if (l != null) {
                JavaMessagingException be = new JavaMessagingException(
                        "JMSErrCode:" + l + " Code:" + j.getErrorCode()
                                + " Message: " + jmsMessage, j);
                throw be;
            } else
                throw new JavaMessagingException(j);
        }catch(Exception e1){
            System.out.println(e1);
        }finally {

            if (sender != null) {
                sender.close();
                TracingHelper.infoLog(QUtil.class, "sendMessage",
                        "Closed sender");
            }
        }
    }

我的代码应该在哪些方面发生变化?

我已经在jre 1.7 + weblogic 12c中实现了相同的代码,但是当我将其更改为jre 1.6 + weblogic 11g时,我得到了这个错误。

3 个答案:

答案 0 :(得分:1)

MQRC 2082 MQRC_UNKOWN_ALIAS_BASE_Q告诉您有问题的队列: -

MQJMS2008: failed to open MQ queue 'OFS.TIG_IND2NSE_MSG'.

是未正确定义的别名队列,因为它指向的基本队列不存在。

建议您使用以下MQSC命令来显示它: -

DISPLAY QALIAS(OFS.TIG_IND2NSE_MSG) ALL

并查找字段TARGET,然后发出另一个MQSC命令以显示别名的队列: -

DISPLAY QUEUE(target-queue-name) ALL

我希望它不会告诉你队列不存在。在这种情况下,您应该定义它,或者更正QALIAS定义以指向正确的目标队列名称。

答案 1 :(得分:1)

从开发的角度来看,当应用程序打开队列时 - 开发人员必须确保使用正确的打开选项来打开WebSphere MQ队列。

如果应用程序想要发送消息,请使用MQOO_OUTPUT打开选项打开队列,而不是任何MQOO_INPUT *选项。

如果应用程序想要收到消息,请使用以下任何一个打开选项打开队列,但不能同时打开所有打开选项 MQOO_INPUT_SHARED MQOO_INPUT_EXCLUSIVE MQOO_INPUT_AS_Q_DEF

原因是,如果正在打开的队列是指向同一队列管理器中存在别名队列的基本队列的别名队列,并且基本队列是本地队列 - 两者都是OUTPUT和INPUT打开选项是有效的。

但是,如果打开的别名队列指向远程队列或存在别名队列的同一队列管理器中的主题,或者别名队列指向不同队列管理器中存在的集群本地队列在群集中,所有MQOO_INPUT *打开选项在此方案中都无效。

因此,始终建议仅打开WebSphere MQ队列,并且仅使用正在执行的操作所需的相应打开选项。

在您的情况下,如果您尝试使用任何MQOO_INPUT * open选项打开别名队列,并且它指向不同队列管理器中的群集本地队列,则它是不正确的。您必须从代码中删除MQOO_INPUT * open选项才能解决问题,因为MQOO_INPUT *选项在此方案中无效。

答案 2 :(得分:0)

当群集或其他远程队列管理器中存在基本队列管理器时,问题是别名。显式设置Queuemanger名称将给出此错误。     如果(jmsConfigQueue.getOpenOptions()!= NULL){         如果(jmsConfigQueue.getOpenOptions()。equalsIgnoreCase( “入站”))         {             mqqueue.setBaseQueueManagerName(qcf.getQueueManager());         }         else if(jmsConfigQueue.getOpenOptions()。equalsIgnoreCase(“Outbound”))         {             mqqueue.setBaseQueueManagerName( “”);         }         其他             mqqueue.setBaseQueueManagerName(qcf.getQueueManager());     }     其他{         mqqueue.setBaseQueueManagerName(qcf.getQueueManager());     }

因此,要启用应用程序搜索Base Queue Manager(Remote),请将其设置为空白。如上面的代码。

相关问题