У меня простая утилита в конфигурации Java JMS на контейнере Weblogic 11g (с использованием Spring 3.x framework для инъекции зависимостей и EJB 2.x для MDB и декларативного управление транзакциями в ejb-jar.xml).как принудительно обновить БД до отправки сообщения JMS в следующую очередь
- Чтение сообщения из очереди-1
- маршализацию сообщения в объект Java
- сохранить unmarshalled объект Java в таблицу
- базы данных отправить сообщение (содержащий объект-идентификатор из step_3) в следующая очередь-2
- прочитать сообщение на очереди-2 (и загрузить объект из базы данных на основе его ID объекта)
Моя проблема заключается в аль в случаях, на шаге 5, я обнаружил, что идентификатор объекта еще не существует в базе данных, я бросаю исключение, петли сообщений возвращаются и повторно проверяются, в итоге объект-объект появляется в базе данных и сообщение на шаге -5 успешно обрабатывается.
В шаге 1-4 обработки рабочего процесса (реализованном в MDB) имеется демаркация транзакции, выполненная как «ТРЕБУЕТСЯ» в ejb-jar.xml, а фабрика соединений - XA. Это означает, что рабочий процесс (step1-4) должен выполняться в транзакции, которая фиксируется, когда сообщение в конечном итоге отправляется в очередь-2 на шаге 4.
Тогда почему шаг 5 не находит идентификатор объекта в базе данных во многих случаях. Есть ли способ заставить это избежать или уменьшить получение этой ошибки на шаге 5.
Я могу потенциально сохранить сообщение на шаге 3 в суб-транзакции, которая будет зафиксирована перед запуском шага 4, но это сломает мою атомарность транзакции для шага 1-4, поэтому я не хочу использовать эту работу, вокруг. –
Проверьте это. http://stackoverflow.com/questions/2418292/delivery-of-jms-message-before-the-transaction-is-committed/2537501#2537501 – satks
Спасибо .. Это бычий глаз. Попробуй завтра и обновишься здесь. .. –