【问题标题】:JMSWMQ0018: Failed to connect to queue manager '' with connection mode 'Bindings' and host name '(1414)'JMSWMQ0018:无法使用连接模式“绑定”和主机名“(1414)”连接到队列管理器“”
【发布时间】:2020-07-17 14:10:04
【问题描述】:

我正在尝试使用示例 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 是空字符串),使用“绑定”连接模式 (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)

当我指定主机时,它适用于“客户端”连接模式,但不适用于绑定。当指定队列管理器(不使用默认值)时,“绑定”连接模式也有效。 是否需要任何额外的队列管理器设置?

【问题讨论】:

  • 您的qm.ini 是否有默认队列管理器节?
  • 是的,你是对的。仅用于完成,位置是:\IBM\MQ\mqs.ini,部分是:DefaultQueueManager: Name=...
  • 是的,谢谢,我是在手机上匆忙输入的,应该提到mqs.ini而不是qm.ini

标签: ibm-mq


【解决方案1】:

为了使用“绑定”连接模式连接到队列管理器,队列管理器必须与应用程序位于同一台机器(相同的 O/S 映像)上。 “绑定”连接模式使用进程间(也称为共享内存)来建立连接。

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

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

当使用“绑定”连接模式建立连接时,队列管理器名称用于确定向哪个本地进程发出进程间请求。如果您已指定本地托管的队列管理器之一作为此机器上的默认队列管理器,则只能省略此名称。只有一个队列管理器是不够的,您仍然必须指定它作为默认值。

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

dspmq -o default

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

【讨论】:

  • 谢谢,我忘了检查默认QM是否设置正确
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 2021-01-15
  • 2020-04-06
  • 2015-06-19
  • 2017-08-21
  • 2019-10-19
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多