2010-11-11 2 views
0

У меня есть объект, у которого есть CallBackListener, зарегистрированный с использованием postPersist и postUpdate. Слушатель принимает объект и отправляет идентификатор в очередь JMS, которая выполняет дальнейшую обработку. Представление и потребление сообщений настолько быстры, что они происходят до того, как первоначальная сессия завершила транзакцию.Мне нужно знать, когда hibernate завершил транзакцию

В результате MDB либо не может найти объект, либо объект устарел. Я действительно хочу, чтобы проверить MDB, чтобы убедиться, что исходная транзакция завершена, прежде чем использовать это сообщение.

Любые предложения?

ответ

2

Вы можете быть в состоянии зарегистрировать экземпляр org.hibernate.Interceptor с SessionFactory или Session и опубликовать сообщение в очередь в методе afterTransactionCompletion(Transaction tx) после консультаций Transaction.wasCommitted. В методе afterTransaction вам может потребоваться доступ к идентификатору вашего объекта в какой-то глобальной threadlocal.

+0

Я провел некоторое тестирование с этим и, похоже, перехватил уровень транзакции БД. Другими словами, он запускается после того, как он передал данные в БД, а не когда транзакция java совершена. Я все еще копаю. – Preston

+0

Не было бы лучше, если бы я отправил JMS-сообщение после того, как DB txn был зафиксирован? Таким образом, MDB увидит зафиксированные данные. Или вы планируете внедрить механизм транзакций, принимающий входные данные в виде сообщений JMS и используя RDBMS для сохранения? –

Смежные вопросы