Каков наилучший способ выполнить следующее?
- Компонент @MessageDriven выполняет некоторую работу с базой данных
- в случае неудачи я хочу откатить транзакцию БД
- но я также хочу, чтобы сообщение JMS НЕ было доставлено повторно, т. Е. Не повторять попытку.
Я могу придумать несколько способов, которые могут работать. Есть ли другие и какие лучше?
используйте
@TransactionManagement(type=BEAN)
иUserTransaction
и явно откатывайтесь после перехвата исключения. например.:catch (Exception e) { e.printStackTrace(); utx.rollback(); }
Используйте транзакции, управляемые контейнером, укажите
@TransactionAttribute(value=NOT_SUPPORTED)
вonMessage
, а затем делегируйте действия БД отдельному методу с помощью@TransactionAttribute(value=REQUIRED)
.Оставьте обработку транзакций в покое и перенастройте свойство повтора на сервере. Я использую Glassfish 3.1.1, и я не совсем уверен, как это установить.
Оставьте все в покое и явно проверьте сообщение на повторную доставку в теле
onMessage
и выйдите из него, если оно будет доставлено повторно. (message.getJMSRedelivered()
?)
Что там хорошо сработало? Есть ли стандартный/лучший способ справиться с этим?