Websphere MQ не работает асинхронный
У нас есть приложение, использующее Websphere MQ v.7.0.1. Сервер работает под Linux, клиентское приложение работает на Windows 7 и написано на Java с использованием классов MQ для java. Одна из очередей между клиентом и сервером предназначена исключительно для протокола keepalive между клиентом и сервером. По ряду причин, в которые мы не должны вдаваться, это необходимо для поддержания соединений с "реальным бэкэндом", частью которого является сервер MQ.
Протокол Keepalive работает достаточно хорошо, за исключением случая, когда один из серверов выходит из строя и клиенты должны повторно подключиться к нему, когда он станет доступным. Тогда у нас проблемы.
Мы решили, что наша реализация протокола keepalive слишком сложна. Клиенту нужно только отправлять эти сообщения поддержки активности на сервер через регулярные промежутки времени и не нужно заботиться о том, достигают они сервера или нет. Если они этого не сделают, сервер примет
соответствующее действие.
Поэтому асинхронный пут напрашивается сам собой. Наша первая попытка реализовать это было следующим:
из этого:
MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the defaults
QueueKL.put(mqMessage,pmo);
к этому:
MQPutMessageOptions pmo = new MQPutMessageOptions();
pmo.options |= CMQC.MQPMO_ASYNC_RESPONSE;
QueueKL.put(mqMessage,pmo);
Результаты оказались неприятным сюрпризом. Вместо немедленного возврата вызов put никогда не возвращается, и поток, из которого он был вызван, никогда не показывает другого признака жизни.
Конечно, этот вызов запускается в блоке try-catch, и мы попытались в крайнем случае перехватить любой возможный Throwable, который может быть брошен, т.е. catch (Throwable t)
и войдите. Ничего подобного не зарегистрировано. Похоже, что на этом этапе поток заблокирован, что полностью противоположно тому, что я ожидал.
Я должен упустить что-то критическое в том, как я реализую это
звоните, (требуются ли какие-то особые настройки в Queue или QueueManager? Документы IBM здесь крайне обострены), но я не знаю, что это такое. Пожалуйста, помогите мне разобраться в этом.
1 ответ
Это помогает? У вас случайно нет 7.0.1.8?
http://www-01.ibm.com/support/docview.wss?uid=swg1IC85084
"Эта проблема также затрагивает пользователей классов WebSphere MQ для Java, которые помещают сообщения в очередь WebSphere MQ с указанием MQPMO_ASYNC_RESPONSE в структуре параметров сообщения PUT (MQPMO)".
Попробуйте убедиться, что на стороне клиента 7.0.1.9 или 7.1.0.2 или выше