Настройка activemq на транзакционный

Его больше концептуального вопроса: у меня в настоящее время есть рабочая очередь activemq, которая потребляется приложением Java Spring. Теперь я хочу, чтобы очередь не удаляла сообщения до тех пор, пока приложение Java не сообщит ей, что сообщение было правильно сохранено в БД. После прочтения документации I get I have to do it transactional and us the commit() / rollback() methods. Поправьте меня,если я ошибаюсь.

Моя проблема заключается в том, что каждый пример, который я нахожу в интернете, говорит мне настроить приложение так или иначе, но мой нос говорит мне, что я должен вместо этого настроить саму очередь, чтобы работать так, как я хочу. И я не могу найти способ сделать это.

В противном случае очередь просто работает по-разному в зависимости от того, как приложение-потребитель настроен для работы? Что я делаю не так?

Спасибо заранее

1 ответ

  1. Очередь не знает о какой-либо транзакционной системе, но вы можете передать 1-й параметр boolean в true, чтобы создать транзакционный сеанс, но я предлагаю INDIVIDUAL_ACKNOWLEDGE при создании сеанса, потому что вы можете управлять сообщениями по одному. Смогите быть установлено на весну jms DefaultMessageListenerContainer.

    ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE
    И вызов этого метода для ack сообщение, если метод не называется сообщение считается отправленным, но не ack.

    ActiveMQTextMessage.acknowledge();
    

    ОБНОВЛЕНИЕ:

    ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE можно использовать как это :

    onMessage(ActiveMQTextMessage message)
    try {
        do some stuff in the database
        jdbc.commit(); (unless auto-commit is enabled on the JDBC)
        message.acknowledge();
    }
    catch (Exception e) {
    }
    

    В ActiveMQ есть 2 вида поддержки транзакций.
    Транзакции JMS-методы commit() / rollback() на сеансе (что похоже на выполнение commit () / rollback () на соединении JDBC)
    XA Transactions — где XASession действует как источник XAResource, взаимодействуя с брокером сообщений, подобно тому, как соединение JDBC происходит в транзакции XA, взаимодействуя с базой данных.

    http://activemq.apache.org/how-do-transactions-work.html

    Следует ли использовать транзакции XA (двухфазная фиксация?)
    Обычно JMS использует сообщения из очереди или раздела, обрабатывает их с помощью базы данных или EJB, а затем подтверждает / фиксирует сообщение.
    Если вы используете более одного ресурса; например, чтение сообщения JMS и запись в базу данных, вы действительно должны использовать XA — его цель состоит в обеспечении атомарных транзакций для нескольких транзакционных ресурсов. Например, существует небольшое окно, начиная с момента завершения обновления базы данных и фиксации изменений до момента фиксации / подтверждения сообщения; если в этом окне происходит сбой сети/оборудования/процесса, сообщение будет повторно доставлено, и вы можете в конечном итоге обработать дубликаты.

    http://activemq.apache.org/should-i-use-xa.html