избегать расы при использовании HornetQ в Jboss - PullRequest
1 голос
/ 20 января 2012

Я использую Jboss 6.1 вместе с Hibernate и HornetQ.Если я манипулирую данными в моей базе данных и добавляю в очередь сообщение, которое опирается на данные, измененные непосредственно перед тем, как я не хочу, чтобы это сообщение было обработано до того, как мои данные будут фактически переданы в базу данных.Поэтому, чтобы избежать условия гонки, я бы хотел включить HornetQ в мою управляемую транзакцию контейнера, чтобы сообщение было «зафиксировано» в очереди, только когда глобальная транзакция также зафиксирована.

Возможно ли это?Есть намеки?

1 Ответ

2 голосов
/ 20 января 2012

Это возможно. Вам нужно будет использовать транзакцию XA, чтобы получить двухфазную фиксацию:

  • Использовать источник данных XA для соединений с базой данных. (Вы используете базу данных с поддержкой XA, верно?)
  • Используйте XA HornetQ ConnectionFactory.

Я обнаружил, что самый простой способ проверить, что вы действительно выполняете транзакцию 2PC, это:

  1. Поместите строку прерывания отладчика после завершения операций JMS и JDBC, но не зафиксированных
  2. Проверьте транзакцию, которая должна быть экземпляром com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple
  3. Проверьте содержимое поля _resources .

Если транзакция представляет собой XA 2PC, это поле (которое является Hashtable) будет содержать 2 XAResource s в качестве ключей, одно для JMS и другое для JDBC.

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

...