Повторная попытка сообщения в определенный момент в будущем (ActiveMQ) - PullRequest
7 голосов
/ 20 мая 2011

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

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

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

Верблюд определенно может помочь с этим ...

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

как-то так ... см. опрос потребителей для более подробной информации

//main route to process message from a queue (needs to be fast)
from("activemq:queue:mainQ").process(...);

//handle any errors by simply moving them to an error queue (for retry later)
onException(Exception.class)
    .handled(true).to("activemq:queue:mainErrorQ");

//retry the error queue
from("timer://retryTimer?fixedRate=true&period=60000")
    .bean(myBean, "retryErrors"); 

...

public void retryErrors() {
    // loop to empty queue
    while (true) {
        // receive the message from the queue, wait at most 3 sec
        Exchange msg = consumer.receive("activemq:queue.mainErrorQ", 3000);
        if (msg == null) {
            // no more messages in queue
            break;
        }

        // send it to the starting queue
        producer.send("activemq:queue.mainQ", msg);
    }
}   

Если вы нашли лучшее решение, дайте мне знать ... удачи

1 голос
/ 29 июня 2012

Магистраль ActiveMQ теперь поддерживает повторную доставку на основе брокера https://issues.apache.org/jira/browse/AMQ-3894

...