从多实例队列管理器中获取活动的QM实例并进行连接 [英] Get Active QM Instance from Multi Instance Queue Manager and connect

查看:149
本文介绍了从多实例队列管理器中获取活动的QM实例并进行连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在将单个队列管理器实例更改为多实例队列管理器时,我很难为多实例队列管理器定义多个主机名. 现有主机在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_NAMEXMSC.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆