Как получить статус соединения Websphere MQ и как сбросить соединение:
======================================================================

1.) Как проверить, подключен ли клиент к серверу с помощью .net-клиента (то есть можно отправлять и получать)? Да, я могу отправить сообщение внутри блока try и поймать следующее исключение, но я 'Я надеюсь на более элегантное решение.

2) Как я могу открывать, закрывать и повторно открывать соединения? В моих попытках решить вопрос 1 выше я обнаружил, что если я открываю соединение, то вызываю connection.Close () Я не могу получить другое соединение от фабрики соединений (см. Фрагмент кода ниже). Я получаю сообщение об ошибке XMSCC0008

Я использую очень стандартную конфигурацию vanilla MQ. Вот как подключается мой клиент:

где MQAccess - это небольшой служебный класс.

Отредактировал вопрос для добавления кода MQAccess:

Изменить: Переименованный класс MQAccess в MQClient. Сделал это экземпляром класса по предложению T Rob. Метод отсоединения все еще падает с сообщениями об ошибках, перечисленными выше

Проблема здесь -> `where MQAccess is a small utility class.`

Первая часть вопроса спрашивает, как определить, активно ли соединение. Классы XMS для WebSphere MQ являются реализацией спецификации JMS для не-Java-платформ. Они довольно точно следуют спецификации JMS, а в спецификации JMS отсутствует метод соединения или сеанса, эквивалентный`isConnected` следовательно, и XMS. Однако все действия GET и PUT должны происходить в блоке try / catch, чтобы перехватить исключения JMS. (Из которого тывсегда распечатать`linkedException`, верно?) Когда выдается исключение JMS, приложение либо считает его фатальным и умирает, либо закрывает все объекты JMS, кроме фабрики соединений, ждет несколько секунд, а затем повторно запускает последовательность соединений.

**ОБНОВЛЕНИЕ на основе новой информации в вопросе:**  
  
Спасибо за публикацию класса MQAccess. Это обеспечивает значительное понимание того, чтопроисходит, хотя до сих пор нетt любой код, показывающий, где соединение закрыто и вновь открыто в соответствии с частью # 2 вопроса.

Тем не менее, код показывает, что`MQAccess` класс создает частный экземпляр`ICONNECTION connection` как экземпляр класса построен, который затем публично выставляется как`MQAccess.GetConnection`,`MQAccess` Класс, опубликованный в настоящее время, не имеет метода открытого или закрытого класса, который когда-либо заменял бы дескриптор соединения`connection` так что если`MQAccess.Connection.Close()` когда-либо называется, что`IConnection` экземпляр объекта в пределах`MQAccess` класс будет всегда после удержания недопустимого дескриптора соединения. Как только соединение закрыто, этот экземпляр`MQAccess` фактически мертв. Вы'пришлось бы удалить и восстановить`MQAccess` чтобы получить новое соединение.

`MQAccess` класс публично выставляет фабрику соединений, так что теоретически можно было бы назвать`MQAccess.GetConnection` из-за пределов класса и получить действительный новый`IConnection` объект, даже после закрытия исходного. Однако этот экземпляр будет существовать вне сферы действия`MQAccess` класс и, следовательно, любые последующие вызовы`MQAccess` будет ссылаться на его несуществующую переменную экземпляра`connection` а не новый экземпляр соединения, созданный вне класса.

Если вам нужно закрыть и воссоздать соединения, вы можете рассмотреть возможность управления этим изнутри`MQAccess`, Низкотехнологичным подходом может быть написание`MQAccess.Close()` метод для соединения, которое закроет существующее соединение, затем немедленно вызовет`connection = GetConnection();` так что частный`connection` переменная всегда содержит действительный дескриптор соединения.

Если это неЧтобы решить проблему, пожалуйста, отправьте код, который закрывает и воссоздает соединения.

Кстати, нетранзакционный сеанс через сетевое соединение открывает возможность потерять или продублировать сообщения для любого провайдера JMS, включая WMQ. Это было то, что вы хотели? Я'я объяснил, почему это в другом посте SO[Вот.](https://stackoverflow.com/questions/4741713/relationship-between-jms-connections-sessions-and-producers-consumers/4748080#4748080)



Добавление к комментариям от T.Rob.

Вопрос 1:  
  
Я надеюсь, что у вас есть доступ к исходному коду`MQAccess`, Если да, вы можете выставить недвижимость в`MQAccess` это указывает, является ли соединение активным или нет. Если у вас нет доступа, возможно, вам придется попросить автора этого класса добавить это свойство. Вы можете сделать следующее, чтобы установить / сбросить свойство.

1) Установите свойство послеCreateConnection метод возвращается успешно.  
  
2) Установите прослушиватель Exception для соединения.  
  
3) Сбросить свойство в обработчике исключений. Проверьте код причины и сбросьте свойство, если оноs ошибка разрыва соединения (XMSWMQ1107 и связанное исключение могут иметь MQRC 2009).

вопрос 2  
  
Было бы полезно, если бы вы могли показать нам, как вы`closing` а также`reopening` соединения. Моя рекомендация закрыть соединение:  
  
1) Сначала сделайте соединение. Stop ().  
  
2) Удалите все прослушиватели сообщений, в основном сделайте consumer.MessageListener = null.  
  
3) Затем сделайте соединение. Закрыть ().  
  
4) сделать соединение = ноль

**Дополнительная информация** Вот образец, который я использовал для тестирования.

В вашем методе, где создается соединение, установите прослушиватель исключений.

Всякий раз, когда возникает ошибка соединения, слушатель исключения будет вызван, и флаг будет установлен в true.

Хорошей практикой является удаление объектов, когда они больше не нужны. Существует родительско-дочерние отношения, Consumer, Producer и т. Д. Являются дочерними объектами Session, который, в свою очередь, является дочерним объектом Connection. Так что порядок распоряжения может быть сначала дочерним, а затем родительским. Но если родитель избавляется, дети также удаляются автоматически.