为XMS.NET中的每个连接配置单独的CCDT文件

时间:2018-07-16 09:31:05

标签: ibm-mq xms

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

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

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

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

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

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

  1. 要求是使用XMS.NET配置标头和消息压缩。
  2. 根据IBM在IBM社区论坛上的回答“ Header and message compression on IBM.XMS with C# .NET”,XMS.NET只能使用通过CCDT进行压缩。
  3. CCDT条目具有QMNAME(*)
  4. CCDT条目之间的差异仅为PORT

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 直接向XMSFactoryFactory指定CCDT位置,而不依赖于环境变量:

直接使用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();