@MessageDriven транзакции и семантика повторной доставки

Какой лучший способ выполнить следующее?

  • @MessageDriven bean выполняет некоторую работу с базой данных
  • при неудаче я хочу откатить транзакцию БД
  • но я также хочу, чтобы JMS сообщение НЕ было доставлено повторно, т.е. не повторять попытку.

Я могу придумать несколько способов, которые могут сработать. Есть ли другие, и какой из них лучше?

  • используйте @TransactionManagement(type=BEAN) и UserTransaction, и явно откатитесь назад после поимки исключения. например:

    catch (Exception e) { e.printStackTrace(); utx.rollback(); }

  • Используйте управляемые контейнером транзакции, укажите @TransactionAttribute(value=NOT_SUPPORTED) на onMessage и затем делегируйте активность БД в отдельный метод с @TransactionAttribute(value=REQUIRED).

  • Оставьте обработку транзакций в покое и переконфигурируйте свойство retry в сервере. Я использую Glassfish 3.1.1, и не совсем понимаю, как его настроить.

  • Оставить все в покое и явно проверить сообщение на повторную доставку в теле onMessage, и выйти, если оно повторно доставлено. (message.getJMSRedelivered()?)

Что здесь хорошо работает? Есть ли стандартный/лучший способ решения этой проблемы?

8
задан wrschneider 31 December 2011 в 17:33
поделиться