作为我们合作伙伴的要求,我们必须在不同的端口上进行MQ连接。要求是为每个端口配置单独 CCDT文件。所有连接均在一个客户端应用程序(一个Process
)上进行。
因为我们的客户端应用程序是一个Process
,所以我无法为每个端口分别配置以下环境变量。
如何设置环境变量以配置客户端通道定义(这是.NET C#):
Environment.SetEnvironmentVariable("MQCHLLIB", @"C:\ProgramData\IBM\MQ");
Environment.SetEnvironmentVariable("MQCHLTAB", "AMQCLCHL<PORT>.TAB");
我们的问题;我们必须在连接级别而不是在流程或全局级别上设置这些环境变量。有什么建议吗?
下面的更新来自评论和聊天中收集的信息:
QMNAME(*)
。PORT
。答案 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();