从 mq 版本 7.0 迁移到 7.5
Migration from mq version 7.0 to 7.5
我正在从 Mq 版本 7.0 迁移到 7.5。我能够使用 ejb - Message Driven Beans(MDBs) 通过入站队列接收消息,但是在 .我收到 IBM MQRC 2082 MQRC_UNKOWN_ALIAS_BASE_Q 异常。
这是我得到的异常:
Caused by: javax.jms.InvalidDestinationException: MQJMS2008: failed to
open MQ queue 'OFS.TIG_IND2NSE_MSG'.
at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getQueueOpenException(MQQueueServices.java:901)
at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getOutputQueue(MQQueueServices.java:727)
at com.ibm.msg.client.wmq.v6.jms.internal.JMSServicesMgr.getOutputQueue(JMSServicesMgr.java:210)
at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createQProducer(MQSession.java:3138)
at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2863)
at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2920)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1191)
at com.ibm.msg.client.jms.internal.JmsXAQueueSessionImpl.createSender(JmsXAQueueSessionImpl.java:415)
at com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:148)
at weblogic.deployment.jms.WrappedSession.createSender(WrappedSession.java:344)
at com.tiger.gmfs.framework.jms.QUtil.getSender(QUtil.java:216)
at 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 时,我收到了这个错误。
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
定义以指向正确的目标队列名称。
从开发的角度来看,当应用程序打开队列时,开发人员必须确保使用正确的打开选项来打开 WebSphere MQ 队列。
如果应用程序想要放置消息,请使用 MQOO_OUTPUT 打开选项而不是任何 MQOO_INPUT* 选项打开队列。
如果应用程序想要获取消息,请使用以下任一打开选项打开队列,但不能同时打开所有选项
MQOO_INPUT_SHARED
MQOO_INPUT_独家
MQOO_INPUT_AS_Q_DEF
原因是,如果正在打开的队列是一个别名队列,它指向存在别名队列的同一队列管理器中的一个基本队列,并且该基本队列是一个本地队列 - OUTPUT 和 INPUT打开选项有效。
但是,如果正在打开的别名队列指向远程队列或别名队列所在的同一队列管理器中的主题,或者如果别名队列指向不同集群中存在的集群本地队列集群中的队列管理器,所有 MQOO_INPUT* 打开选项在此场景中均无效。
因此,始终建议仅打开 WebSphere MQ 队列,并且仅使用执行操作所需的适当打开选项。
在您的情况下,如果您尝试使用任何 MQOO_INPUT* 打开选项打开别名队列,并且它指向不同队列管理器中的集群本地队列,这是不正确的。您必须从代码中删除 MQOO_INPUT* 打开选项才能解决此问题,因为 MQOO_INPUT* 选项在这种情况下无效。
当基本队列管理器存在于集群或其他某个远程队列管理器中时,问题出在别名上。显式设置 Queuemanger 名称会出现此错误。
如果(jmsConfigQueue.getOpenOptions()!=空){
如果(jmsConfigQueue.getOpenOptions().equalsIgnoreCase("Inbound"))
{
mqqueue.setBaseQueueManagerName(qcf.getQueueManager());
}
else if(jmsConfigQueue.getOpenOptions().equalsIgnoreCase("Outbound"))
{
mqqueue.setBaseQueueManagerName("");
}
别的
mqqueue.setBaseQueueManagerName(qcf.getQueueManager());
}
别的 {
mqqueue.setBaseQueueManagerName(qcf.getQueueManager());
}
因此,要启用应用程序搜索,请将基本队列管理器(远程)设置为空白。如上代码。
我正在从 Mq 版本 7.0 迁移到 7.5。我能够使用 ejb - Message Driven Beans(MDBs) 通过入站队列接收消息,但是在 .我收到 IBM MQRC 2082 MQRC_UNKOWN_ALIAS_BASE_Q 异常。
这是我得到的异常:
Caused by: javax.jms.InvalidDestinationException: MQJMS2008: failed to open MQ queue 'OFS.TIG_IND2NSE_MSG'. at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getQueueOpenException(MQQueueServices.java:901) at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getOutputQueue(MQQueueServices.java:727) at com.ibm.msg.client.wmq.v6.jms.internal.JMSServicesMgr.getOutputQueue(JMSServicesMgr.java:210) at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createQProducer(MQSession.java:3138) at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2863) at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2920) at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1191) at com.ibm.msg.client.jms.internal.JmsXAQueueSessionImpl.createSender(JmsXAQueueSessionImpl.java:415) at com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:148) at weblogic.deployment.jms.WrappedSession.createSender(WrappedSession.java:344) at com.tiger.gmfs.framework.jms.QUtil.getSender(QUtil.java:216) at 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 时,我收到了这个错误。
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
定义以指向正确的目标队列名称。
从开发的角度来看,当应用程序打开队列时,开发人员必须确保使用正确的打开选项来打开 WebSphere MQ 队列。
如果应用程序想要放置消息,请使用 MQOO_OUTPUT 打开选项而不是任何 MQOO_INPUT* 选项打开队列。
如果应用程序想要获取消息,请使用以下任一打开选项打开队列,但不能同时打开所有选项 MQOO_INPUT_SHARED MQOO_INPUT_独家 MQOO_INPUT_AS_Q_DEF
原因是,如果正在打开的队列是一个别名队列,它指向存在别名队列的同一队列管理器中的一个基本队列,并且该基本队列是一个本地队列 - OUTPUT 和 INPUT打开选项有效。
但是,如果正在打开的别名队列指向远程队列或别名队列所在的同一队列管理器中的主题,或者如果别名队列指向不同集群中存在的集群本地队列集群中的队列管理器,所有 MQOO_INPUT* 打开选项在此场景中均无效。
因此,始终建议仅打开 WebSphere MQ 队列,并且仅使用执行操作所需的适当打开选项。
在您的情况下,如果您尝试使用任何 MQOO_INPUT* 打开选项打开别名队列,并且它指向不同队列管理器中的集群本地队列,这是不正确的。您必须从代码中删除 MQOO_INPUT* 打开选项才能解决此问题,因为 MQOO_INPUT* 选项在这种情况下无效。
当基本队列管理器存在于集群或其他某个远程队列管理器中时,问题出在别名上。显式设置 Queuemanger 名称会出现此错误。 如果(jmsConfigQueue.getOpenOptions()!=空){ 如果(jmsConfigQueue.getOpenOptions().equalsIgnoreCase("Inbound")) { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } else if(jmsConfigQueue.getOpenOptions().equalsIgnoreCase("Outbound")) { mqqueue.setBaseQueueManagerName(""); } 别的 mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } 别的 { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); }
因此,要启用应用程序搜索,请将基本队列管理器(远程)设置为空白。如上代码。