Повторная попытка отправки сообщения в какой-то момент в будущем (ActiveMQ)

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

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


person Brendan Long    schedule 19.05.2011    source источник


Ответы (2)


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

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

что-то вроде этого... см. опрос потребителя для более подробной информации

//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);
    }
}   

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

person Ben ODay    schedule 20.05.2011
comment
"If you land on a better solution, let me know...good luck Мне просто интересно, есть ли у вас лучшее решение этой проблемы? - person AlanFoster; 17.07.2012
comment
на данный момент у меня нет лучшего решения. Я начал добавлять некоторую поддержку для этого с помощью EIP pollEnrich(), но на данный момент он вынесен на обсуждение... см.: issues.apache.org/jira/browse/CAMEL-3211 - person Ben ODay; 17.07.2012
comment
Ах, хорошо, я пока буду придерживаться вашего текущего решения, спасибо! - person AlanFoster; 17.07.2012

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

person gtully    schedule 29.06.2012