При отключении от WebSphere MQ с клиентом C# TCP-соединения все еще находятся в состоянии CLOSE_WAIT.

Я отключаюсь от MQQueue и MQQueueManager с помощью следующего кода:

Queue.Close();
log.Info( "Queue IsOpen: " + Queue.IsOpen.ToString() );
Queue = null;

QueueManager.Disconnect();
QueueManager.Close();
log.Info( "QM IsOpen: " + QueueManager.IsOpen.ToString() );
log.Info( "QM IsConnected: " + QueueManager.IsConnected.ToString() );
QueueManager = null;

И я получаю следующие записи журнала для этого:

Queue IsOpen: false
QM IsOpen: false
QM IsConnected: false

Но через несколько часов, когда я запускаю команду netstat -n из командной строки, я получаю длинный список подключений к серверу MQ, и состояние этих подключений — CLOSE_WAIT.

Любые идеи, почему TCP-соединения не закрываются полностью? Есть ли способ убить их из кода? В настоящее время мне придется перезапустить клиентское приложение, которое очищает открытые соединения.

Версия WebSphere MQ — 6.0.2.6, а библиотеки .NET — из MQ 7.


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


Ответы (1)


В Руководстве по миграции есть раздел под названием Обновление клиента WebSphere MQ с версии 6.0 до версии 7.0, что предлагает возможное объяснение. В нем говорится, что начиная с v7 настройка TCP хранится в файле конфигурации клиента. Поэтому, если вы включили TCP Keepalive в реестре Windows, клиент v7 проигнорирует его. Формат и расположение файла описаны в файл конфигурации клиента WebSphere MQ.

Конечно, чтобы это было проблемой, должна быть утечка сокета. Вы не упомянули, какая у вас версия клиента WMQ V7, но в файлах README пакета исправлений действительно отображается ряд APAR, связанных с утечками сокетов, невозможностью очистки после отключения и т. д. Ни в одном из них напрямую не упоминается C# или .Net, но проблем с подключением/отключением достаточно, чтобы обновить его.

Итак, первое и самое простое решение — добавить TCP Keepalive в файл конфигурации клиента и посмотреть, поможет ли это. Отключите общий доступ к соединению, пока вы там находитесь. Это не должно быть фактором, но и не должно быть утечки сокетов. Не могу повредить. Затем следует применить Fix Pack 7.0.1.2 ( последний на момент написания этой статьи) и посмотрите, решит ли это проблему. После этого наступает время ПМР. Надеюсь, это поможет.

person T.Rob    schedule 22.06.2010
comment
Я не уверен, почему это принято в качестве ответа. Предлагается несколько обходных путей, и один из них может решить проблему, но окончательного решения здесь не предлагается. Снятие голоса. - person theKing; 04.09.2013
comment
В вопросе не было достаточно информации, чтобы дать окончательное решение. Основываясь на предоставленной информации, я предоставил информацию, по-видимому, достаточную для OP, чтобы решить проблему. Итак, я голосую против, потому что ОП не удосужился обновить свой вопрос? Понижение не принесло вам лучшего ответа и, вероятно, приведет к тому, что вас проигнорируют люди, которым вы хотели бы ответить, если вы зададите свой вопрос. Это было непродуктивно и неуместно, ИМХО. - person T.Rob; 04.09.2013
comment
@theKing Говорю это как пользователь, а не как модератор, но вы заметили, что этому сообщению уже более трех лет? - person Andrew Barber; 10.09.2013