как принудительно обновить БД перед отправкой сообщения JMS в следующую очередь

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

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

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

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

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


person robin bajaj    schedule 03.07.2015    source источник
comment
Я потенциально мог бы сохранить сообщение на шаге 3 в суб-транзакции, которая фиксируется до выполнения шага 4, но это нарушит атомарность моей транзакции на шаге 1-4, поэтому я не хочу использовать этот обходной путь.   -  person robin bajaj    schedule 04.07.2015
comment
Проверь это. stackoverflow.com/questions/2418292/   -  person satks    schedule 04.07.2015
comment
Спасибо .. Это в яблочко .. Попробую завтра и обновлю здесь ..   -  person robin bajaj    schedule 06.07.2015
comment
во-вторых, это, по сути, вынуждает рабочий процесс стать сериализованным ... если у нас есть несколько событий, пытающихся обновить одну и ту же строку во втором рабочем процессе ... мы, по сути, блокируем их все, чтобы идти туда один за другим, резко сокращая пропускная способность системы .. по этой причине у нас не работает .. Я все еще ищу другие доступные варианты в настоящее время ..   -  person robin bajaj    schedule 06.07.2015


Ответы (2)


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

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

person Andrei    schedule 03.07.2015

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

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

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

person robin bajaj    schedule 05.10.2015