@MessageDriven транзакции и семантика повторных поставок - PullRequest
8 голосов
/ 31 декабря 2011

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

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

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

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

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

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

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

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

Что там хорошо сработало? Существует ли стандартный / передовой метод решения этой проблемы?

Ответы [ 2 ]

8 голосов
/ 02 января 2012

Самый простой и самый переносимый подход - использовать @TransactionAttribute(value=NOT_SUPPORTED) на onMessage(), как вы заявляете, и переносить работу БД на другой компонент с @TransactionAttribute(REQUIRES_NEW)

Будьте осторожны с подходом отдельного метода, так как он не будетРабота.В JMS MDB метод onMessage() является единственным методом, в котором можно использовать @TransactionAttribute.

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

Лично я никогда не выполняю никакой работы в MDB, но немедленно отправляю (вставленный) сессионный компонент.

Этот компонент затем выполняет работу БД.Он либо запускает новую транзакцию, либо я перехватываю любое исключение из компонента и регистрирую его (но не позволяю ему распространяться, поэтому повторной доставки не требуется).

Это также имеет то преимущество, что бизнес-логику можно легко использовать повторно.из других мест.

...