Java 从mq 7.0版迁移到7.5版

Java 从mq 7.0版迁移到7.5版,java,jakarta-ee,jms,ibm-mq,weblogic11g,Java,Jakarta Ee,Jms,Ibm Mq,Weblogic11g,我正在从Mq版本7.0迁移到7.5。我能够使用ejb消息驱动Bean(MDB)通过入站队列接收消息,但在服务器上处理消息后发布消息。我得到了IBM MQRC 2082 MQRC_unknown_ALIAS_BASE_Q异常 这是我得到的一个例外: 原因:javax.jms.InvalidDestinationException:MQJMS2008:未能 打开MQ队列'OFS.TIG_IND2NSE_MSG'。 位于com.ibm.msg.client.wmq.v6.jms.internal.MQ

我正在从Mq版本7.0迁移到7.5。我能够使用ejb消息驱动Bean(MDB)通过入站队列接收消息,但在服务器上处理消息后发布消息。我得到了IBM MQRC 2082 MQRC_unknown_ALIAS_BASE_Q异常

这是我得到的一个例外:

原因:javax.jms.InvalidDestinationException:MQJMS2008:未能 打开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.jmsxaqueuessessionimpl$1.createSender(jmsxaqueuessessionimpl.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.sendmages(QUtil.java:110)

我写的代码是: 这是我的getSender方法: 受保护的QueueSender getSender()抛出JavaMessaginException, 性感觉{

    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时,我发现了这个错误。MQRC 2082 MQRC_unknown_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
定义以指向正确的目标队列名称。

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

如果应用程序希望放置消息,请使用MQOO_输出打开选项而不是任何MQOO_输入*选项打开队列

如果应用程序希望获取消息,请使用以下任一打开选项打开队列,但不能同时打开所有选项 MQOO_输入_共享 MQOO_输入_独占 MQOO_输入_作为_Q_定义

原因是,如果要打开的队列是一个别名队列,指向别名队列所在的同一队列管理器中的基本队列,而基本队列是一个本地队列,则输出和输入打开选项均有效

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

因此,始终建议仅打开WebSphere MQ队列,并且仅使用执行操作所需的适当打开选项


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

问题当基本队列管理器存在于群集或其他远程队列管理器时,用于别名。显式设置Queuemanger名称将导致此错误。 if(jmsConfigQueue.getOpenOptions()!=null){ if(jmsConfigQueue.getOpenOptions().equalsIgnoreCase(“入站”)) { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } else if(jmsConfigQueue.getOpenOptions().equalsIgnoreCase(“出站”)) { mqqueue.setBaseQueueManagerName(“”); } 其他的 mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } 否则{ mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); }


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

您正在使用的MQ队列管理器的版本是什么?您在weblogic中使用的MQ客户端的版本是什么?您正在使用MQ JCA RA吗?MQ客户端版本是7.0+weblogic 11g+否我们没有使用MQ JCA,而这里的情况是-用户正在尝试使用(MQC.MQOO_INPUT*)打开别名队列它指向不同队列管理器中的群集本地队列。应用程序必须仅为PUT(MQOO_输出)打开而不是GET,这解决了问题。如果我在同一别名队列上运行amqsputc,它就可以正常工作并解析集群队列。如果我运行amqsgetc,我会得到2082,因为别名所在的本地队列管理器中不存在基队列。来自IBM PMR--------------------------------打开选项:0x00000022 MQOO\U INPUT\U SHARED0x00000002 MQOO_查询0x00000020 08:59:07.728611--}!kqiSetupQPath rc=krcE\U选项\U无效\U类型08:59:07