在将来的某个时间点重试消息(ActiveMQ)

时间:2011-05-19 21:25:32

标签: activemq apache-camel

我正在使用ActiveMQ中的系统,我真的不想丢失消息。我的问题是重试消息导致我的消费者阻止(而不是处理他们可以处理的消息)。我想在几天内给失败的消息重试(例如,我的一个潜在目的地是我将通过SFTP访问的另一台服务器,可能会关闭),但我不希望消费者阻塞几天 - - 我希望它继续处理其他消息。

有没有办法告诉代理稍后重新发送邮件?现在我正在考虑将消息从队列中取出并延迟启动,但我想知道是否有更简单的方法。我正在使用Apache Camel,所以使用它的解决方案也会很好。

2 个答案:

答案 0 :(得分:5)

Camel绝对可以帮助解决这个问题......

一种方法是使用单独的队列并定期与主流分开重试消息(特别是在考虑性能时)。此外,这提供了一个单独的队列,允许您对这些错误消息进行分类(查看,清除,更改,手动重试等)......

类似的内容......有关详细信息,请参阅polling consumer

//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 :(得分:1)

ActiveMQ主干现在支持基于经纪人的重新发送https://issues.apache.org/jira/browse/AMQ-3894