Предоставление сообщения JMS перед транзакцией фиксируется

У меня есть очень простой сценарий, включающий базу данных и JMS в сервере приложений (Glassfish). Сценарий очень прост:

1. an EJB inserts a row in the database and sends a message.
2. when the message is delivered with an MDB, the row is read and updated. 

Проблема состоит в том, что иногда сообщение передается, прежде чем вставка фиксировалась в базе данных. Это на самом деле понятно, если мы рассматриваем 2 протокола фиксации фазы:

1. prepare JMS
2. prepare database
3. commit JMS
4. ( tiny little gap where message can be delivered before insert has been committed)
5. commit database

Я обсудил эту проблему с другими, но ответ всегда был: "Странный, это должно работать из поля".

Мои вопросы затем:

  • Как это могло работать out-of-the поле?
  • Мой сценарий звучит довольно простым, почему не там больше людей с подобными проблемами?
  • Я делаю что-то не так? Существует ли способ решить эту проблему правильно?

Вот немного больше деталей о моем понимании проблемы:

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

Я не нашел способа управлять порядком участников распределенных транзакций в JTA, JCA и спецификациях JPA ни один в документации Glassfish. Мы могли предположить, что они будут включены в список в распределенную транзакцию согласно порядку, когда они будут использоваться, но с ORM, таким как JPA, трудно знать, когда данные сбрасываются и когда соединение с базой данных действительно используется. Какая-либо идея?

20
задан ewernli 11 March 2010 в 09:11
поделиться

1 ответ

Вы испытываете классическое состояние гонки XA 2-PC. Такое случается в производственных средах.

Мне на ум приходят три вещи.

  1. Последняя оптимизация агента, где JDBC является не XA ресурсом. (Потеря семантики восстановления)
  2. Иметь JMS Time-To-Deliver. (Намеренная потеря реального времени)
  3. Встроить повторные попытки в код JDBC. (Наименьшее влияние на функциональность)

Weblogic имеет эту LLR оптимизацию, которая позволяет избежать этой проблемы и дает вам все XA гарантии.

11
ответ дан 30 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: