Могу ли я отправить запрос сообщения непосредственно в очередь? - PullRequest
3 голосов
/ 08 января 2012

У меня есть клиент, который получает сообщения из очереди.В настоящее время у меня есть MessageListener, который реализует onMessage().

После получения сообщения оно обрабатывается и сохраняется в базе данных по методу onMessage();Затем клиент подтверждает получение сообщения.

Пока база данных работает, проблем нет.Но если БД не работает, клиент не подтвердит.

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

На самом деле, единственный способ сделать это - перезапустить клиент, который не является идеальным.Есть ли способ инициировать очередь для повторной отправки неподтвержденного сообщения без перезапуска?

Что у меня есть в onMessage():

//code to connect to  queue
try {
if (DB is available){
        //process message
        //save required details to DB
        msg.acknowledge();
    }
    else{
        //schedule to request same message later from queue
    }
} catch (Exception e) {}

Ответы [ 2 ]

0 голосов
/ 09 января 2012

После еще одного исследования я наткнулся на session.recover (), который я могу использовать для запуска повторной доставки. Я видел, что есть класс RedeliveryPolicy, который я могу использовать для установки параметров повторной отправки сообщения. Теперь мой код выглядит так:

ConnectionFactory factory = new ActiveMQConnectionFactory(url);
RedeliveryPolicy policy = new RedeliveryPolicy();
policy.setBackOffMultiplier((short) 2);
policy.setRedeliveryDelay(30000);
policy.setInitialRedeliveryDelay(60000);
policy.setUseExponentialBackOff(true);
((ActiveMQConnectionFactory)factory).setRedeliveryPolicy(policy);

final Session session = connection.createSession(false,
                Session.CLIENT_ACKNOWLEDGE);
...
...
...
..


//inside onMessage()
try {
    if (DB is available){
        //process message
        //save required details to DB
        msg.acknowledge();
    }
    else{
        session.recover();
    }
    } catch (Exception e) {}
0 голосов
/ 08 января 2012

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

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

...