IBM MQ Client отключается через 10 минут: IBM.XMS.IllegalStateException - PullRequest
2 голосов
/ 08 июля 2019

Я использую этот пример от IBM. Я только что скопировал и вставил код:

https://github.com/ibm-messaging/mq-dev-patterns/blob/master/dotnet/dotNetGet.cs

  • Я подключаюсь к серверу MQ версии 9.0.0.5
  • Я использую консольное приложение .Net Framework 4.6.1
  • Клиент MQ, установленный на моих локальных машинах: 9.1.0.1

Я вижу очень странное поведение. Приложение работает нормально и может получать сообщения. Но он отключился бы ровно через 10 минут. Это всегда 10 минут.

Это пойманная ошибка:

IBM.XMS.IllegalStateException: Failed to get a message from destination MY_QUEUE.
IBM MQ classes for XMS attempted to perform an MQGET; however IBM MQ reported an error.
Use the linked exception to determine the cause of this error.
   at IBM.XMS.Client.Impl.XmsMessageConsumerImpl.ReceiveInboundMessage(Int64 timeout)
   at IBM.XMS.Client.Impl.XmsMessageConsumerImpl.Receive(Int64 millis)
   at Mq_Get_Tests.SimpleConsumer.ReceiveMessages() in C:\Users\osotorrio\Projects\Temporal\Mq_Get_Tests\Mq_Get_Tests\SimpleConsumer.cs:line 137
Linked Exception : CompCode: 2, Reason: 2009*

В примере IBM отсутствуют некоторые параметры конфигурации, позволяющие клиенту повторно подключаться после 10 минут бездействия?

1 Ответ

3 голосов
/ 08 июля 2019

Симптомы, которые вы описываете, похоже, соответствуют APAR IT26614: клиентский канал MQ dotnet (.NET) аварийно завершается при достижении пульса (HBINT) .

The fix is targeted for delivery in the following PTFs:

Version    Maintenance Level
v8.0       8.0.0.13
v9.0 LTS   9.0.0.7
v9.1 CD    9.1.3
v9.1 LTS   9.1.0.3

По состоянию на 8 июля 2019 года была выпущена только 9.0.0.7, которую можно загрузить с MQC9: клиенты IBM MQ V9


Чтобы дать некоторое представление о том, каквсе должно работать:

  1. Клиентское приложение MQ при подключении к администратору очередей согласовывает интервал пульса (HBINT), который является значением в секундах.Согласованный HBINT всегда является наибольшим значением, согласованным между SVRCONN и клиентским приложением.
    Примечание: A SVRCONN HBINT имеет значение по умолчанию 300.
  2. На основе HBINT время ожидания рассчитывается одним из двух способов:
    1. Если согласованное значение HBINT меньше 60, время ожидания равно 2x HBINT.(полученный тайм-аут составляет HBINT секунд после того, как прошел HBINT)
    2. Если согласованный HBINT больше или равен 60, время ожидания равно HBINT + 60. (тайм-аут приема составляет 60 секунд послеHBINT прошел).
  3. Если от администратора очередей в течение HBINT времени не было получено нормального трафика, клиент должен отправить Heart Beat администратору очереди, который должен ответить,Клиент должен дождаться истечения времени ожидания приема для получения Heart Beat.
  4. Администратор очередей также может инициировать Heart Beat для клиента, но для предотвращения дополнительного трафика администратор очередей ожидает на пять секунд больше, чемсогласованный HBINT перед отправкой сердцебиения клиенту.

APAR IT26614 исправляет следующие три проблемы:

  1. В неуправляемом илиВ управляемом режиме задокументировано, что если вы не используете CCDT, HBINT будет использовать значение канала SVRCONN.В действительности, если не использовать CCDT, HBINT на стороне клиента по умолчанию будет 300, поэтому это самое низкое значение HBINT, которое вы увидите.

  2. Специально для Managed .NETна стороне клиента HBINT не может быть ниже SVRCONN HBINT, соединение с 2059 не будет установлено. Эта проблема касается как с, так и без CCDT.

    • с CCDT, который вы не можете установитьCLNTCONN HBINT до значения, меньшего SVRCONN HBINT
    • без CCDT, на вас повлияет, если для SVRCONN HBINT установлено значение 301 или выше
  3. Специфично для управляемого .NET тайм-аут приема на стороне клиента рассчитывался в миллисекундах, а не секундах.В этом случае дефект присутствовал в соответствии с IBM в течение длительного времени, но не появлялся до тех пор, пока APAR IT16167: Управляемое клиентское приложение .NET не отправляет запрос пульса диспетчеру очереди , введенному в 8.0.0.10.и 9.0.0.4 (IBM также подтвердила, что это присутствует в GA 9.1.0.0).Причина, по которой раньше это не было проблемой, заключалась в том, что Managed .NET никогда не инициировал сердцебиение, менеджер очередей всегда отправлял сердцебиение со скоростью HBINT + 5 секунд, а клиент .NET отвечал.Как только это было исправлено, просчет времени ожидания приема представился.


Основываясь на версии 9.1.0.1 Managed XMS.NET клиента, я подозреваю, что это происходит:

  1. HBINT согласовывается до 300 секунд независимо от того, что установлено SVRCONN HBINT.
  2. Управляемый клиент XMS.NET отправит Heart Beat менеджеру очередей после того, как он ничего не получил отадминистратор очередей в течение 300 секунд.
  3. В этот момент клиент Managed XMS.NET будет ожидать ответа от администратора очередей только 60 мс.
  4. Если клиент Managed XMS.NET не получаетответ через 60 мс вернет приложению ошибку 2009 года.
  5. В журналах ошибок администратора очередей будет отображаться AMQ9209 с сообщением «Произошла ошибка при получении данных от« dnsname (xx.xx.xx.xx) »в течениеTCP / IP.

Вы упоминаете, что видели это только через 10 минут (600 секунд), но я видел это через любые 300-секундные интервалы, основанные на задержке сети.Если вы подключаетесь к администратору очередей на том же сервере или в том же сегменте локальной сети, вы можете никогда не увидеть эту проблему.Если вы подключаетесь по глобальной сети с высокой задержкой, это может происходить каждые 300 секунд.Если вы подключены к сегменту, близкому к 30 мс, вы можете видеть его периодически.

Я предлагаю вам попробовать клиент 9.0.0.7 Managed XMS.NET и посмотреть, решит ли он проблему для вас с этого выпуска.он будет ждать полных 60 секунд ответа Heart Beat от администратора очередей.


Если вы хотите добавить повторное подключение к образцу, который бы маскировал проблему, если бы не использовалась версия MQ, включающая APARIT26614, вы можете использовать следующие настройки:

cf.SetIntProperty(XMSC.WMQ_CLIENT_RECONNECT_OPTIONS, XMSC.WMQ_CLIENT_RECONNECT);
cf.SetIntProperty(XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT, XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT_DEFAULT);
//Note that XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT_DEFAULT is 1800

Обратите внимание, что даже если вы используете версию MQ с APAR IT26614, вышеприведенная практика является хорошей практикой, поскольку она сообщает клиенту Managed XMS.NET, что она пытается автоматическипереподключиться к администратору очередей на XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT секунд, если соединение потеряно.Повторное подключение не применяется к начальному подключению к администратору очередей, оно применяется только после того, как вы подключились.

...