从多实例队列管理器中获取活动的QM实例并进行连接 [英] Get Active QM Instance from Multi Instance Queue Manager and connect
问题描述
在将单个队列管理器实例更改为多实例队列管理器时,我很难为多实例队列管理器定义多个主机名. 现有主机在web.config
I have trouble defining multiple hostname for multi-instance queue manager as I am changing a single instance of queue manager to multi-instance queue manager. The existing host is defined in web.config
<QueueConfigurationSection>
<QueueConfiguration>
<add name="SomeQueueHandler" queueManager="QM1" host="99.99.99.01" port="12345" requestQueue="A.B.REQUEST" service="FLATFILE" responseQueue="B.A.RESPONSE" internalResponseQueue="B.A.INTERNAL" channel="A.SVC.SVRCONN" binding="SOAP11TcpBinding" endPoint="net.tcp://localhost:808/Bus/SomeServiceBus.svc/SOAP11" />
</QueueConfiguration>
</QueueConfigurationSection>
连接在这里定义
public List<QueueHandler> Queues
{
get
{
if (_queues == null)
_queues = new List<QueueHandler>();
if (_queues.Count == 0 && _queueConfiguration != null)
{
//create queue handlers from configuration provided
foreach (QueueConfigurationElement element in _queueConfiguration)
{
// Using a different connection factory for each queue
XMSFactoryFactory factory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
IConnectionFactory connectionProperties = factory.CreateConnectionFactory();
connectionProperties.SetStringProperty(XMSC.WMQ_HOST_NAME, element.Host);
connectionProperties.SetIntProperty(XMSC.WMQ_PORT, element.Port);
connectionProperties.SetStringProperty(XMSC.WMQ_CHANNEL, element.Channel);
connectionProperties.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
connectionProperties.SetIntProperty(XMSC.WMQ_BROKER_VERSION, XMSC.WMQ_BROKER_V1);
connectionProperties.SetBooleanProperty(XMSC.WMQ_USE_CONNECTION_POOLING, true);
var queue = new QueueHandler(element.Name, connectionProperties);
_queues.Add(queue);
}
}
return new List<QueueHandler>(_queues);
}
}
QueueHandler:
QueueHandler:
public QueueHandler(string handlerName, IConnectionFactory mqConnectionFactory)
{
_connectionProperties = mqConnectionFactory;
var queueConfigurationSection = ConfigurationManager.GetSection(QueueConfigurationSection.SectionName) as QueueConfigurationSection;
if (queueConfigurationSection != null)
{
if (queueConfigurationSection.QueueConfigurationCollection.Cast<QueueConfigurationElement>().Any(qc => qc.Name == handlerName))
{
var element = queueConfigurationSection.QueueConfigurationCollection.Cast<QueueConfigurationElement>().First(qc => qc.Name == handlerName);
_name = element.Name;
_serviceType = element.DestinationService;
_queueManagerName = element.QueueManager;
_channel = element.Channel;
_requestQueueName = element.RequestQueue;
_responseQueueName = element.ResponseQueue;
_internalResponseQueueName = element.InternalResponseQueue;
_port = element.Port;
_host = element.Host;
//set up binding configuraion
EndpointType bindingEnum;
if (System.Enum.TryParse(element.Binding, out bindingEnum))
{
_messageType = bindingEnum;
switch (bindingEnum)
{
case EndpointType.FlatFileTcpBinding:
//message received from the request queue is plain text - by configuration
_dvsBinding = EndpointHelper.CreateFlatFileTCPBinding();
break;
// ...
default:
//unsupported endpoint configuration
throw new Exception("Unsupported binding configuration");
}
}
//create endpoint address
_endPointAddress = new EndpointAddress(element.EndPoint);
}
}
}
主机名和端口也在SendNewMessage方法的同一类中定义...
and the hostname and port also defines in the same class in a SendNewMessage method...
try
{
if (port != 0)
MQEnvironment.Port = port;
if (host != ".")
MQEnvironment.Hostname = host;
if (channel != ".")
MQEnvironment.Channel = channel;
hMgr = new MQQueueManager(manager);
}
那么如何在MQEnvironment.Hostname中设置备用主机?
So how do I set the standby host in MQEnvironment.Hostname?
推荐答案
有多种方法可以为MQ提供多个要连接的主机名和端口号.我在下面的建议中提供了与您已经指定主机和端口的方式类似的设置.
There are multiple ways to provide MQ with multiple host names and port numbers to connect to. My suggestions below specify settings similar to how you already specify host and port.
对于使用XMS的QueueHandler
,您可以用以下三个属性替换属性XMSC.WMQ_HOST_NAME
和XMSC.WMQ_PORT
.下面的示例假定您在web.config中定义了host1,port1,host2,port2:
For your QueueHandler
which is using XMS you would replace the properties XMSC.WMQ_HOST_NAME
and XMSC.WMQ_PORT
with the three properties below. The example below assumes you have defined host1, port1, host2, port2 in your web.config:
connectionProperties.SetIntProperty(XMSC.WMQ_CLIENT_RECONNECT_OPTIONS, XMSC.WMQ_CLIENT_RECONNECT_Q_MGR);
connectionProperties.SetStringProperty(XMSC.WMQ_CONNECTION_NAME_LIST, String.Format("{0}({1}),{2}({3})", element.Host1, element.Port1, element.Host2, element.Port2));
connectionProperties.SetIntProperty(XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT, XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT_DEFAULT);
这些属性的链接到IBM MQ知识中心页面:
Links to the IBM MQ Knowledge center pages for those properties:
- XMSC_WMQ_CONNECTION_NAME_LIST
- XMSC_WMQ_CLIENT_RECONNECT_TIMEOUT
- XMSC_WMQ_CLIENT_RECONNECT_OPTIONS
在IBM安装目录下,您可以查看以下XMS示例程序:
Under the IBM install directory you can review the following XMS sample program:
tools\dotnet\samples\cs\xms\simple\wmq\SimpleClientAutoReconnect\SimpleClientAutoReconnect.cs
对于使用IBM MQ C#库编写的SendNewMessage
方法,您可以用属性的Hashtable
替换MQEnvironment
设置,并更改调用MQQueueManager
传递Hashtable
的方式.这具有在MQEnvironment
不是的情况下保持线程安全的附加好处.下面的示例假定您已在web.config中定义了host1,port1,host2,port2:
For your SendNewMessage
method which is written using the IBM MQ C# libraries you would replace your MQEnvironment
settings with a Hashtable
of the properties and change the way you call MQQueueManager
to pass the Hashtable
. This has the added benefit of being thread safe where MQEnvironment
is not. The example below assumes you have defined host1, port1, host2, port2 in your web.config:
properties = new Hashtable();
properties.Add(MQC.CONNECTION_NAME_PROPERTY, String.Format("{0}({1}),{2}({3})", host1, port1, host2, port2));
properties.Add(MQC.CHANNEL_PROPERTY, channel);
properties.Add(MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT_Q_MGR);
hMgr = new MQQueueManager(manager, properties);
IBM MQ Knowldege中心页面" MQQueueManager .NET类"具有有关属性的更多信息.
The IBM MQ Knowldege center page "MQQueueManager .NET class" has more information on the properties.
在IBM安装目录下,您可以查看以下C#示例程序:
Under the IBM install directory you can review the following C# sample program:
tools\dotnet\samples\cs\base\SimpleClientAutoReconnectPut\SimpleClientAutoReconnectPut.cs
这篇关于从多实例队列管理器中获取活动的QM实例并进行连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!