首页 > 解决方案 > 为 IBM MQ 设置 QueueManager 属性的目的是什么?

问题描述

按照这个发送消息到队列的例子,让我们看看设置连接工厂属性的部分

        cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, HOST);
        cf.setIntProperty(WMQConstants.WMQ_PORT, PORT);
        cf.setStringProperty(WMQConstants.WMQ_CHANNEL, CHANNEL);
        cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
        cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QMGR);
        cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
        cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
        cf.setStringProperty(WMQConstants.USERID, APP_USER);
        cf.setStringProperty(WMQConstants.PASSWORD, APP_PASSWORD); 

删除该行cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QMGR);后,没有任何变化:客户端仍然可以成功发送和接收消息。

在这里设置WMQConstants.WMQ_QUEUE_MANAGER属性的目的是什么?

IBM MQ 服务器是一个基于这个 Dockefile 的容器:

FROM ibmcom/mq:9.2.2.0-r1

ENV LICENSE=accept
ENV MQ_DEV=true
ENV MQ_APP_PASSWORD=app-password
ENV MQ_ADMIN_PASSWORD=admin-pwd
ENV MQ_QMGR_NAME=KUPOL_DEV_QM

另外:
在同一个示例中,我们看到该行,如果删除
destination = context.createQueue("queue:///" + QUEUE_NAME)
前缀,它不会破坏应用程序,将该行保留为."queue:///"
destination = context.createQueue(QUEUE_NAME)

我在 Web 上的多个 IBM MQ 示例中看到了类似的情况。
这段代码是怎么回事?是盲目复制粘贴还是有目的?

标签: javajmsibm-mqmessage-queue

解决方案


如果您未设置队列管理器或指定以 a 为前缀的值,那么*您可以连接到侦听您指定的主机和端口的任何队列管理器名称。

如果您指定的队列管理器名称不以 a 为前缀,*那么它必须与在主机和端口上侦听的队列管理器的名称相匹配。

您还可以使用 CCDT 保存连接详细信息,在这种情况下(除了上述几点)您指定的队列管理器名称用于在 CCDT 中查找连接详细信息。如果它以 a 为前缀,它将在 CCDT 中*查找不带 the 的名称。*

除了使用queue:///前缀指定队列名称之外,您还可以使用前缀指定主题topic:///,我的猜测是createQueue默认假设您正在指定队列名称。


推荐阅读