Включение метода onMessage () в атомарное действие - PullRequest
2 голосов
/ 26 января 2012

Я столкнулся с проблемой, что, если мой метод, приведенный ниже, не работает или это исключение, я все равно использую сообщение.Я хотел бы, чтобы функциональность выполняла откат во время перехвата и помещала сообщение обратно в очередь / тему.

public void onMessage(Message message)
{

    String messageId = null;
    Date messagePublished = null;

    try
    {
        messageId = message.getJMSMessageID();
        messagePublished = new Date(message.getJMSTimestamp());
        LOGGER.info("JMS Message id =" + messageId + " JMS Timestamp= " + messagePublished);
        process(message);
        LOGGER.info(" returning from onMessage() successfully =" + messageId + " JMS Timestamp= " + messagePublished);
    }
    catch(Throwable t)
    {
        LOGGER.error("Exception:",t);
        LOGGER.error(t.getStackTrace() + "\n Exception is unrecoverable.");
        throw new RuntimeException("Failed to handle message.",t);
    }

}

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Для этого вы можете посмотреть различные режимы подтверждения, которые существуют в JMS.См. Эту статью http://www.javaworld.com/javaworld/jw-02-2002/jw-0315-jms.html.

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

Вы можете вызвать подтверждение после вызова процесса (сообщения), если в методе обработки (сообщения) возникает исключение, сообщение не будет удалено из-за отсутствия подтверждения.Мы использовали этот подход ранее с Oracle AQ, и он работает очень хорошо.

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

0 голосов
/ 07 февраля 2012

вы должны иметь возможность просто выполнить свой метод onMessage.

...