Получить активный экземпляр QM из диспетчера очередей Multi Instance и подключиться
У меня проблемы с определением нескольких имен хостов для менеджера очередей с несколькими экземплярами, так как я меняю один экземпляр администратора очередей на менеджер очередей с несколькими экземплярами. Существующий хост определен в 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:
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...
try
{
if (port != 0)
MQEnvironment.Port = port;
if (host != ".")
MQEnvironment.Hostname = host;
if (channel != ".")
MQEnvironment.Channel = channel;
hMgr = new MQQueueManager(manager);
}
Итак, как мне установить резервный хост в MQEnvironment.Hostname?
1 ответ
Есть несколько способов предоставить MQ несколько имен хостов и номеров портов для подключения. Мои предложения ниже указывают параметры, аналогичные тому, как вы уже указали хост и порт.
Для тебя QueueHandler
который использует XMS, вы бы заменили свойства XMSC.WMQ_HOST_NAME
а также XMSC.WMQ_PORT
с тремя свойствами ниже. В приведенном ниже примере предполагается, что вы определили host1, port1, host2, port2 в вашем файле 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 для этих свойств:
В каталоге установки IBM вы можете просмотреть следующий пример программы XMS:
tools\dotnet\samples\cs\xms\simple\wmq\SimpleClientAutoReconnect\SimpleClientAutoReconnect.cs
Для тебя SendNewMessage
метод, который написан с использованием библиотек IBM MQ C#, вы бы заменить MQEnvironment
Настройки с Hashtable
свойств и изменить способ вызова MQQueueManager
пройти Hashtable
, Это имеет дополнительное преимущество в том, чтобы быть потокобезопасным, где MQEnvironment
не является. В приведенном ниже примере предполагается, что вы определили host1, port1, host2, port2 в вашем файле 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 class" содержится дополнительная информация о свойствах.
В каталоге установки IBM вы можете ознакомиться со следующей программой C#:
tools\dotnet\samples\cs\base\SimpleClientAutoReconnectPut\SimpleClientAutoReconnectPut.cs