2015-07-03 6 views
0

У меня простая утилита в конфигурации Java JMS на контейнере Weblogic 11g (с использованием Spring 3.x framework для инъекции зависимостей и EJB 2.x для MDB и декларативного управление транзакциями в ejb-jar.xml).как принудительно обновить БД до отправки сообщения JMS в следующую очередь

  1. Чтение сообщения из очереди-1
  2. маршализацию сообщения в объект Java
  3. сохранить unmarshalled объект Java в таблицу
  4. базы данных отправить сообщение (содержащий объект-идентификатор из step_3) в следующая очередь-2
  5. прочитать сообщение на очереди-2 (и загрузить объект из базы данных на основе его ID объекта)

Моя проблема заключается в аль в случаях, на шаге 5, я обнаружил, что идентификатор объекта еще не существует в базе данных, я бросаю исключение, петли сообщений возвращаются и повторно проверяются, в итоге объект-объект появляется в базе данных и сообщение на шаге -5 успешно обрабатывается.

В шаге 1-4 обработки рабочего процесса (реализованном в MDB) имеется демаркация транзакции, выполненная как «ТРЕБУЕТСЯ» в ejb-jar.xml, а фабрика соединений - XA. Это означает, что рабочий процесс (step1-4) должен выполняться в транзакции, которая фиксируется, когда сообщение в конечном итоге отправляется в очередь-2 на шаге 4.

Тогда почему шаг 5 не находит идентификатор объекта в базе данных во многих случаях. Есть ли способ заставить это избежать или уменьшить получение этой ошибки на шаге 5.

+0

Я могу потенциально сохранить сообщение на шаге 3 в суб-транзакции, которая будет зафиксирована перед запуском шага 4, но это сломает мою атомарность транзакции для шага 1-4, поэтому я не хочу использовать эту работу, вокруг. –

+1

Проверьте это. http://stackoverflow.com/questions/2418292/delivery-of-jms-message-before-the-transaction-is-committed/2537501#2537501 – satks

+0

Спасибо .. Это бычий глаз. Попробуй завтра и обновишься здесь. .. –

ответ

1

Если вы говорите, что в большинстве случаев, на шаге 5, объект не в БД, вполне возможно, что сделка не получает совершенное время вы получаете к шагу 5.

Что делать, если вы ждете результата от транзакции, прежде чем читать сообщение из очереди 2. Если это два разных процесса, вы можете уведомить другой компьютер о том, что все сообщения в очереди 1 были доставлены, и он готов продолжить чтение сообщения от очереди 2.

0

Я искал решение, используя контейнер weblogic. Я нашел эту настройку под названием «« Время-доставить »« Переопределить »в консоли weblogic, которая определена как Задержка по умолчанию, между тем, когда создается сообщение, и когда оно становится видимым в целевом получателе, независимо от доставки время, указанное производитель и/или фабрика соединений

time-to-deliver-override-link я установить это значение до 3-4 секунд, и я получил эту проблему уменьшенной на 90% время.

Просто вставьте эту информацию здесь, чтобы кто-то другой, ищущий эту проблему, мог воспользоваться ею.