Сначала нужно ввести org.springframework.transaction.PlatformTransactionManager
- это обычный боб, как и все остальные:
@Resource
private PlatformTransactionManager transactionManager;
Теперь вы можете использовать его вместе с TransactionTemplate
:
final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallback<String>() {
@Override
public Object doInTransaction(TransactionStatus status) {
transactionManager.rollback(status);
return ":-(";
}
});
Довольно много кода, поэтому вот как вы должны это сделать:
@Transactional
public void onMessage(Message message) {
//rollback:
throw new HoustonException("We've got a problem!");
}
Если вы бросите метод RuntimeException
из @Transactional
, он автоматически откатит эту транзакцию.В противном случае оно будет зафиксировано.
Обратите внимание, что это не означает, что JMS и база данных работают над одной и той же транзакцией!Когда вы генерируете исключение, JMS-брокер попытается повторно доставить сообщение, однако есть вероятность, что этот брокер потерпит неудачу после фиксации транзакции с БД.Если вам нужно быть на 100% уверенным, что обновления JMS и БД являются атомарными, вам нужен распределенный диспетчер транзакций.