Я пишу 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, о котором мне нужно знать?