SpringAMQP延迟

时间:2016-07-07 02:49:34

标签: rabbitmq spring-amqp spring-rabbit rabbitmq-exchange

我无法确定在SpringAMQP中延迟消息级别的方法。 我调用Web服务如果服务不可用或者它抛出一些异常我将所有请求存储到RabbitMQ队列中并且我继续重试服务调用,直到它成功执行。如果服务不断抛出错误或者它不可用,那么rabbitMQ监听器将继续循环。(意思是监听器检索消息并在消息重新排队时发出服务调用)

我使用MessagePostProcessor限制循环直到X小时但是我想在消息级别和每次尝试访问服务时启用延迟。例如,第一次尝试3000ms延迟,第二次尝试6000ms,直到我尝试x次。

如果您提供一些示例,那就太棒了。

请你就此提出一些想法吗?

2 个答案:

答案 0 :(得分:1)

嗯,你不可能这样做。

消息重新排队与事务rallback完全相似,系统返回异常之前的状态。所以,绝对不能修改消息以返回队列。

可能你必须查看Spring Retry项目是出于同样的原因,并且只从队列中轮询一次消息并在内存中重试,直到成功回答或重试策略耗尽为止。最后,您只需从队列中删除消息或将其移至DLQ。

查看Reference Manual中的更多信息。

答案 1 :(得分:1)

I added CustomeMessage delay exchange

    @Bean
    CustomExchange delayExchange() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-delayed-type", "direct");
        return new CustomExchange("delayed-exchange", "x-delayed-message", true, false, args);
    }

Added MessagePostProcessor

  if (message.getMessageProperties().getHeaders().get("x-delay") == null) {
            message.getMessageProperties().setHeader("x-delay", 10000);
        } else {

            Integer integer = (Integer) message.getMessageProperties().getHeaders().get("x-delay");
            if (integer < 60000) {
                integer = integer + 10000;
                message.getMessageProperties().setHeader("x-delay", integer);
            }
        }

First time it delays 30 seconds and adds 10seconds each time till it reaches 600 seconds.This should be configurable.

And finally send the message to 

    rabbitTemplate.convertAndSend("delayed-exchange", queueName,message, rabbitMQMessagePostProcessor);