Получение кода причины ошибки 2059 на клиенте MQ (C #) при повторном подключении к QueueManager через некоторое время

Я не могу повторно подключиться к MQQueueManager через некоторое время, поскольку возникает исключение (код причины 2059 - MQRC_Q_MGR_NOT_AVAILABLE), когда я создаю новый объект MQQueueManager. Мое клиентское приложение написано на .NET / C #, и я запускаю его на Win2003.

Однако я могу подключиться к QM после перезапуска клиентского приложения. Это может указывать на некорректное состояние библиотек QM? Как я могу сбросить состояние в коде, чтобы я мог повторно подключиться к QM? Есть ли способ сбросить / отключить все активные TCP-подключения к QM из кода клиентского приложения?

Мой код подключения:

    Hashtable properties = new Hashtable();
    properties.Add( MQC.HOST_NAME_PROPERTY, Host );
    properties.Add( MQC.PORT_PROPERTY, Port );
    properties.Add( MQC.USER_ID_PROPERTY, UserId );
    properties.Add( MQC.PASSWORD_PROPERTY, Password );
    properties.Add( MQC.CHANNEL_PROPERTY, ChannelName );
    properties.Add( MQC.TRANSPORT_PROPERTY, TransportType );
    // Following line throws an exception randomly
    MQQueueManager queueManager = new MQQueueManager( qmName, properties );

Трассировки стека:

    Source: amqmdnet
    CompletionCode: 2
    ReasonCode: 2059
    Reason: 2059
    Stack Trace:
     at IBM.WMQ.MQBase.throwNewMQException()
     at IBM.WMQ.MQQueueManager.Connect(String queueManagerName)
     at IBM.WMQ.MQQueueManager..ctor(String qmName, Hashtable properties)
     at WebSphereMQOutboundAdapter.WebSphereMQOutbound.ConnectToWebSphereMQ()

person Tommi L.    schedule 04.06.2010    source источник


Ответы (2)


Соединения для каждого потока, поэтому, если вы пытаетесь создать новое соединение, в то время как предыдущий объект QMgr все еще создается, вы получите это. Если вы закроете предыдущее соединение и уничтожите объект перед созданием нового объекта, все должно быть в порядке. Поскольку очереди и другие объекты WMQ зависят от дескриптора соединения, их также необходимо будет уничтожить, а затем восстановить после установления нового соединения.

Конечно, есть несколько других объяснений такого поведения, но они гораздо менее вероятны. Например, возможно, что выход из канала или (в WMQ v7) конфигурация могут ограничивать количество одновременных подключений с данного IP-адреса. Когда соединение разрывается, а не закрывается, агент канала, поддерживающий соединение на стороне QMgr, должен истечь время ожидания, прежде чем QMgr увидит соединение как закрытое. Если установлено ограничение на количество подключений, эти «призрачные» подключения уменьшают доступный пул. Но, как я уже сказал, это встречается гораздо реже, чем программы, не очищающие старые объекты перед попыткой повторного подключения.

Также есть вероятность, что это ошибка. Чтобы уменьшить эту возможность и по ряду других причин, таких как WMQ v6, срок службы которого истекает в следующем году, я бы рекомендовал использовать WMQ v7.0.1.2 для этого проекта как на стороне клиента, так и на стороне сервера. В общем, вы можете использовать клиент v7.0.1.2 с сервером v6.0.x, если придерживаетесь функциональности v6. Среди прочего, код .Net лучше интегрирован в v7, а пакеты поддержки Cat-3 теперь включены в базовый установочный носитель, а не загружаются отдельно.

person T.Rob    schedule 04.06.2010

После нескольких месяцев борьбы с этой проблемой и поддержки IBM лучшее решение, которое я нашел, - это изменить код подключения / отключения в драйвере IBM MQ.

Вместо того, чтобы вызывать manager.Disconnect () и manager.Close () для каждого GET / PUT, подключитесь один раз, а затем повторно подключитесь, только если у вас есть какое-то исключение (например, потеря соединения).

Я выяснил, что в драйвере IBM MQ существует некоторая ошибка, которая кэширует некоторую информацию для каждого подключения / отключения. Когда этот буфер заполняется, приложение перестает переподключаться.

Версия драйвера (клиентская DLL) у меня проблема: 7.0.1.6

person Eric Lemes    schedule 14.07.2014
comment
Можете ли вы проверить с помощью последнего пакета исправлений 7.0.1.12? Это исправление - www-01.ibm.com/support/docview .wss? rs = 171 & uid = swg1IC97860 может решить вашу проблему. - person Shashi; 15.07.2014
comment
В моей программе я также подключаюсь один раз, а затем повторно подключаюсь только в случае возникновения исключения ... но знаете ли вы, нужно ли мне вызывать .Disconnect () при обработке ошибок или для переменной isConnected автоматически устанавливается значение false и MQ отключается? - person ZerOne; 04.02.2015