Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将来某个时候重试消息(ActiveMQ)_Activemq_Apache Camel - Fatal编程技术网

在将来某个时候重试消息(ActiveMQ)

在将来某个时候重试消息(ActiveMQ),activemq,apache-camel,Activemq,Apache Camel,我正在使用ActiveMQ中的一个系统,在这个系统中,我真的希望不丢失消息。我的问题是,重试消息会导致我的消费者阻塞(而不是处理他们可以处理的消息)。我希望给失败的消息几天时间重试(例如,我的一个潜在目的地是我将通过SFTP访问的另一个服务器,它可能会关闭),但我不希望消费者阻塞几天——我希望它继续处理其他消息 有没有办法告诉代理稍后重新发送消息?现在,我正在考虑将消息从队列中移除,并将其延迟,但我想知道是否有更简单的方法。我正在使用ApacheCamel,所以使用它的解决方案也会很好。Came

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


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

Camel肯定能帮上忙

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

类似这样的内容…有关更多详细信息,请参阅

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

如果您找到了更好的解决方案,请告诉我……祝您好运,ActiveMQ trunk现在支持基于代理的重新交付

“如果您找到了更好的解决方案,请告诉我……祝您好运
我只是想知道您现在是否有更好的解决方案?目前,我没有更好的解决方案。我开始使用pollEnrich()EIP添加一些支持来实现这一点,但现在已经提交了…请看:啊,好的,我现在继续使用您当前的解决方案,谢谢!