JMSWMQ0018:无法使用连接模式 'Bindings' 和主机名“(1414)”连接到队列管理器“”
JMSWMQ0018: Failed to connect to queue manager '' with connection mode 'Bindings' and host name '(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 为空字符串),使用 'Binding' 连接模式(WMQConstants.WMQ_CM_BINDINGS)并删除主机(WMQConstants.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)
当我指定主机时,它适用于 'Client' 连接模式,但不适用于绑定。此外,'Binding' 连接模式在指定队列管理器(未使用默认值)时有效。
是否需要任何额外的队列管理器设置?
为了使用 'Binding' 连接模式连接到队列管理器,队列管理器必须与应用程序位于同一台机器上(相同的 O/S 图像)。 'Binding' 连接模式使用进程间 - 也称为共享内存 - 建立连接。
当使用 'Client' 连接模式建立连接时,应用程序使用 TCP/IP 套接字连接到队列管理器,并与提供的主机和端口号建立连接。
使用 'Client' 连接模式建立连接时,如果您愿意连接到 'Client' 另一端出现的任何队列管理器,则无需在连接调用中提供队列管理器名称=30=]套接字。
使用'Binding'连接模式建立连接时,队列管理器名称用于确定向哪个本地进程发出进程间请求。如果您已指定本地托管的队列管理器之一作为该机器上的默认队列管理器,则只能省略此名称。只有一个队列管理器是不够的,你仍然必须指定它为默认值。
为了查看您的机器上是否有任何标记为默认的队列管理器,请发出以下命令:
dspmq -o default
如果您没有默认队列管理器,您可以按照说明 here.
将本地托管的队列管理器之一设为默认队列管理器
我正在尝试使用示例 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 为空字符串),使用 'Binding' 连接模式(WMQConstants.WMQ_CM_BINDINGS)并删除主机(WMQConstants.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)
当我指定主机时,它适用于 'Client' 连接模式,但不适用于绑定。此外,'Binding' 连接模式在指定队列管理器(未使用默认值)时有效。 是否需要任何额外的队列管理器设置?
为了使用 'Binding' 连接模式连接到队列管理器,队列管理器必须与应用程序位于同一台机器上(相同的 O/S 图像)。 'Binding' 连接模式使用进程间 - 也称为共享内存 - 建立连接。
当使用 'Client' 连接模式建立连接时,应用程序使用 TCP/IP 套接字连接到队列管理器,并与提供的主机和端口号建立连接。
使用 'Client' 连接模式建立连接时,如果您愿意连接到 'Client' 另一端出现的任何队列管理器,则无需在连接调用中提供队列管理器名称=30=]套接字。
使用'Binding'连接模式建立连接时,队列管理器名称用于确定向哪个本地进程发出进程间请求。如果您已指定本地托管的队列管理器之一作为该机器上的默认队列管理器,则只能省略此名称。只有一个队列管理器是不够的,你仍然必须指定它为默认值。
为了查看您的机器上是否有任何标记为默认的队列管理器,请发出以下命令:
dspmq -o default
如果您没有默认队列管理器,您可以按照说明 here.
将本地托管的队列管理器之一设为默认队列管理器