【问题标题】:Migration from mq version 7.0 to 7.5从 mq 版本 7.0 迁移到 7.5
【发布时间】:2015-03-14 15:44:18
【问题描述】:

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

这是我得到的例外:

原因:javax.jms.InvalidDestinationException: MQJMS2008: failed to 打开 MQ 队列“OFS.TIG​​_IND2NSE_MSG”。 在 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 方法: 受保护的 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 时,我收到此错误。

【问题讨论】:

  • 您使用的 MQ 队列管理器的版本是什么?您在 weblogic 中使用的 MQ 客户端的版本是什么?您在使用 MQ JCA RA 吗?
  • MQ 客户端版本是 7.0 +Weblogic 11g +不,我们没有使用 MQ JCA RA

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


【解决方案1】:

当集群或其他远程队列管理器中存在基本队列管理器时,问题出在别名上。显式设置 Queuemanger 名称将给出此错误。 if(jmsConfigQueue.getOpenOptions()!=null){ if(jmsConfigQueue.getOpenOptions().equalsIgnoreCase("Inbound")) { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } 否则 if(jmsConfigQueue.getOpenOptions().equalsIgnoreCase("Outbound")) { mqqueue.setBaseQueueManagerName(""); } 别的 mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } 别的 { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); }

所以要启用应用程序搜索,基本队列管理器(远程)将其设置为空白。如上面的代码。

【讨论】:

    【解决方案2】:

    从开发的角度来看,当应用程序打开队列时 - 开发人员必须确保使用正确的打开选项来打开 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* 打开选项打开别名队列,并且它指向不同队列管理器中的集群本地队列,则这是不正确的。您必须从代码中删除 MQOO_INPUT* 打开选项才能解决问题,因为 MQOO_INPUT* 选项在这种情况下无效。

    【讨论】:

    • 先生:@Vinay 先生:此链接上的任何 cmets:[链接]mail-archive.com/mqseries@akh-wien.ac.at/msg14002.html... 我认为我的应用程序在启动时初始化 QueueConnectionFactory 时设置了 QueueManager 名称...效果很好对于 MDB 的入站,但在发布消息时,它再次使用与显式设置相同的 QueueManager 名称。但根据此链接,队列管理器名称应使用空白,因为基本队列位于远程队列管理器中。每当它尝试检查队列管理器时,它都会失败......请发表评论......
    • 是的,如果您的应用程序使用 JMS,则忽略消息生成器上的队列管理器名称或将其保留为空白将有助于解决问题。祝你好运。
    【解决方案3】:

    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 定义以指向正确的目标队列名称。

    【讨论】:

    • 这里的情况是 - 用户尝试使用 (MQC.MQOO_INPUT*) 打开一个别名队列,该队列指向不同队列管理器中的集群本地队列。应用程序必须只为 PUT (MQOO_OUTPUT) 而不是 GET 打开,这解决了问题。如果我在同一个别名队列上运行 amqsputc,它就可以正常工作并解析集群队列。如果我运行 amqsgetc,我得到 2082,因为基本队列不存在于存在别名的本地队列管理器中。
    • 来自 IBM PMR ----------------------------------- 打开选项:0x00000022 MQOO_INPUT_SHARED 0x00000002 MQOO_INQUIRE 0x00000020 08:59:07.728611 --}! kqiSetupQPath rc=krcE_OPTION_NOT_VALID_FOR_TYPE 08:59:07.728615 --}! kqiOpenQueue rc=krcE_OPTION_NOT_VALID_FOR_TYPE 主题不允许使用以下选项。 MQOO_INPUT_AS_Q_DEF MQOO_INPUT_SHARED MQOO_INPUT_EXCLUSIVE MQOO_BROWSE 另请注意,在解析为未在本地定义的集群队列的对象上也不允许使用 MQOO_INPUT* 选项。 ----------结束---------
    • @VinaySathyanarayana 您的 cmets 会给出一个很好的答案文本,您为什么不和他们一起写一个答案,那么如果合适的话,它也可以被接受为正确答案。听起来可能还有其他信息可以添加到问题中?您可以随时编辑问题以将其添加到其中。
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多