0

作为我们合作伙伴的要求,我们必须在不同的端口上建立 MQ 连接。并且要求为每个端口配置单独的 CCDT 文件,因为。所有连接都在一个客户端应用程序(一个Process)上进行。

因为我们的客户端应用程序是一个Process,所以我不能分别为每个端口配置以下环境变量。

如何设置环境变量以配置客户端通道定义(这是 .NET C#):

        Environment.SetEnvironmentVariable("MQCHLLIB", @"C:\ProgramData\IBM\MQ");
        Environment.SetEnvironmentVariable("MQCHLTAB", "AMQCLCHL<PORT>.TAB");

我们的问题;我们必须在连接级别而不是在进程或全局级别设置这些环境变量。有什么建议么?

以下更新来自评论和聊天中收集的信息:

  1. 要求是使用 XMS.NET 配置 Header 和 Message 压缩。
  2. 根据 IBM 对 IBM 社区论坛帖子“带有 C# .NET 的 IBM.XMS 上的标头和消息压缩”的回答, XMS.NET 只能使用 CCDT 进行压缩。
  3. CCDT 条目有QMNAME(*).
  4. CCDT 条目之间的区别仅在于PORT.
4

2 回答 2

1

你是说一旦你启动你的应用程序(进程),它会在一次执行中连接和断开不同的队列管理器?如果是这样,那么设置环境变量然后动态更改它们将不起作用。

更好的方法是创建一个包含 4 个部分的 INI 文件 - 每个端口 1 个。让您的应用程序从 INI 文件加载特定部分,使用这些特定值创建一个 Hashtable 并将 Hashtable 传递给 MQQueueManager 类。

有关读取 INI 文件的更多信息,请参阅:https ://code.msdn.microsoft.com/windowsdesktop/Reading-and-Writing-Values-85084b6a

我会将 INI 文件的 1414 部分设置为:

[Port1414]
mq.qmname=MQA1
mq.channel=TEST.CHL
mq.hostname=10.10.10.10
mq.port=1414
mq.userid=MyUserId
mq.inputq=SOME.INPUT.QUEUE
mq.outputq=SOME.OUTPUT.QUEUE

对于 INI 文件的 1415 部分,如下所示:

[Port1415]
mq.qmname=MQA1
mq.channel=TEST.CHL
mq.hostname=10.10.10.10
mq.port=1415
mq.userid=MyUserId
mq.inputq=SOME.INPUT.QUEUE2
mq.outputq=SOME.OUTPUT.QUEUE2

1415 和 1416 也是如此。

阅读 INI 文件的特定部分后,您将执行以下操作:

Hashtable qMgrProp = new Hashtable();
qMgrProp.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
qMgrProp.Add(MQC.CHANNEL_PROPERTY, channelName);
qMgrProp.Add(MQC.HOST_NAME_PROPERTY, hostname);
qMgrProp.Add(MQC.PORT_PROPERTY, 1414);
qMgrProp.Add(MQC.USER_ID_PROPERTY, userId);

MQQueueManager qMgr = new MQQueueManager(qManager, qMgrProp);
于 2018-07-16T17:45:03.267 回答
1

选项 1(如果它有效,这似乎更简单,因为您不再需要您正在使用的 CCDT,因为它是以前唯一已知的指定压缩选项的方法):

基于 JMS 和 XMS 的文档组合,我认为以下可能有效,请尝试一下,如果这不起作用,那么我将从我的答案中删除它,如果它有效,那么我将使用指向该混合物的链接进行更新的文档。

var factory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
var cf = factory.CreateConnectionFactory();
cf.SetStringProperty(XMSC.WMQ_HOST_NAME, host);
cf.SetIntProperty(XMSC.WMQ_PORT, port);
cf.SetStringProperty(XMSC.WMQ_CHANNEL, channel);
//empty string "" or "*" would work equally well for XMSC.WMQ_QUEUE_MANAGER to accept any queue manager name
cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "");
cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);
cf.SetStringProperty(XMSC.WMQ_HEADER_COMP, "SYSTEM NONE");
cf.SetStringProperty(XMSC.WMQ_MSG_COMP, "ZLIBFAST ZLIBHIGH RLE NONE");
connection = cf.CreateConnection();

选项 2直接将 CCDT 位置指定到 XMSFactoryFactory 并且不依赖于环境变量:

直接创建带有 CCDT 链接的 CF,而不是使用环境变量。

var factory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
var cf = factory.CreateConnectionFactory();
cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);
cf.SetStringProperty(XMSC.WMQ_CCDTURL, @"file://C:\ProgramData\IBM\MQ\AMQCLCHL<PORT>.TAB";
cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "*");
connection = cf.CreateConnection();
于 2018-07-16T20:19:44.407 回答