JMSWMQ0018:无法连接到具有连接方式'Bindings'和主机名'(1414)'的队列管理器



我正在尝试使用示例JmsPutGet.java 中简化的JMS MQ连接

private static void testQueueManagerNew() throws JMSException {

JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "");
cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "MY_CNL");
//                  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);

cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_BINDINGS);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, ""); //it should use default QM
JMSContext context = cf.createContext();
Destination destination = context.createQueue("queue:///" + "MY_QUEUE");
long uniqueNumber = System.currentTimeMillis() % 1000;
TextMessage message = context.createTextMessage("Your lucky number today is " + uniqueNumber);
JMSProducer producer = context.createProducer();
producer.send(destination, message);
LOGGER.info("Sent message:{}{}", message, System.lineSeparator());
JMSConsumer consumer = context.createConsumer(destination); // autoclosable
String receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds
LOGGER.info("Rreceived message:{}{}", receivedMessage, System.lineSeparator());
}

我所做的更改是使用默认的队列管理器(WMQConstants.WMQ_Queue_Manager为空字符串(,使用"绑定"连接模式(WMQConctants.WMQ_CM_BINDINGS(,并删除主机(WMQCconstants.WMQ host_NAME为空串(。我收到以下异常:

com.ibm.msg.client.jms.DetailedIllegalStateRuntimeException: JMSWMQ0018: Failed to connect to queue manager '' with connection mode 'Bindings' and host name '(1414)'.
at com.ibm.msg.client.jms.DetailedIllegalStateException.getUnchecked(DetailedIllegalStateException.java:274)
at com.ibm.msg.client.jms.internal.JmsErrorUtils.convertJMSException(JmsErrorUtils.java:173)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createContext(JmsConnectionFactoryImpl.java:478)
at poc.ibmmq.defaultqm.DefaultQM.testQueueManagerNew(DefaultQM.java:86)
at poc.ibmmq.defaultqm.DefaultQM.main(DefaultQM.java:59)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2059' ('MQRC_Q_MGR_NOT_AVAILABLE').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:418)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7815)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:303)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createContext(JmsConnectionFactoryImpl.java:444)

当我指定主机时,它适用于"客户端"连接模式,但不适用于绑定。此外,当指定了队列管理器(未使用默认值(时,"绑定"连接模式也可以工作。是否需要任何额外的队列管理器设置?

要使用"绑定"连接模式连接到队列管理器,队列管理器必须与应用程序位于同一台计算机上(相同的O/S映像(。'绑定连接模式使用进程间(也称为共享内存(进行连接。

当使用"客户端"连接模式进行连接时,应用程序会使用TCP/IP套接字连接到队列管理器,并提供与主机的连接和端口号。

当使用"客户端"连接模式进行连接时,如果您愿意连接到TCP/IP套接字另一端出现的任何队列管理器,则无需在连接调用上提供队列管理器名称。

当使用"绑定"连接模式进行连接时,队列管理器名称用于确定向哪个本地进程发出进程间请求。只有在指定一个本地托管的队列管理器作为此计算机上的默认队列管理器时,才能省略此名称。只有一个队列管理器是不够的,您仍然必须指定它作为默认队列管理器。

为了查看您的机器上是否有任何标记为默认的队列管理器,请发出以下命令:

dspmq -o default

如果您没有默认的队列管理器,您可以按照此处的说明将本地托管的一个队列管理器设置为默认队列管理器。

最新更新