Как перестать терять сообщения на MQ - PullRequest
3 голосов
/ 15 апреля 2011

Я пишу Java-приложение, работающее в среде LINUX, которое выполняет транзакции на MQ с использованием SYNCPOINT.Он использует Websphere MQ Java Classes для взаимодействия со службой MQ.В моем коде я делаю следующее (псевдо):

MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_FAIL_IF_QUIESCING | MQConstants.MQGMO_SYNCPOINT;

MQMessage message = new Message();
queue.get(message, gmo);

// process the message, save to database

databaseConnection.commit();
queueManager.commit();

Я в основном беру сообщение, обрабатываю его, сохраняю в базе данных, затем вызываю коммит в queueManager.Процесс прослушивает сообщение в TIBRV, чтобы выполнить корректное завершение.

Я проверял процесс, чтобы убедиться, что ни одно сообщение не потеряно.Я помещаю 20 тыс. Сообщений в очередь, затем запускаю процесс.Я выполняю изящный вызов отключения в середине обработки.Затем я сравниваю количество сообщений в очереди с количеством сообщений в базе данных.Когда из-за сообщения TIBRV происходит постепенное отключение, количество сообщений MQ + количество сообщений DB = общее количество сообщений, первоначально находящихся в очереди.

Однако, когда я выполняю kill или kill -9, я вижучто сообщение потеряно.Я всегда получаю в итоге 19999 сообщений.

Есть ли способ узнать, как я теряю это сообщение?Есть ли что-то, что происходит на сервере приложений Websphere, о котором мне нужно знать?

Ответы [ 2 ]

5 голосов
/ 29 апреля 2011

Нет причин ожидать совпадения чисел при использовании однофазной фиксации. Программа всегда будет между вызовом WMQ и фиксацией DB или между вызовом DB и WMQ Commit, когда вы ее убьете.

Для того, что вы запрашиваете, потребуется 2-фазный (XA) коммит. Для WMQ 2PC потребует, чтобы приложение использовало режим привязок, а WMQ должен быть координатором ресурсов. Затем вы должны вызвать MQBEGIN, выполнить обновления WMQ и DB, а затем вызвать MQCOMMIT. Таким образом, и транзакции WMQ, и БД будут успешными или неуспешными.

0 голосов
/ 16 апреля 2011

Вы подключаетесь или MQ в режиме привязок или в режиме клиента?По моему опыту, транзакции не работали из коробки в режиме клиента, но они работали в режиме привязки.

...