RabbitMQ延迟消息无效

时间:2017-06-27 12:42:01

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

我正在尝试使用延迟交换插件,但不知何故它不适用于我并且消息会立即收到。

我尝试了以下事项:

a)成功启用了rabbitmq_delayed_message_exchange,并在ubuntu-16.04上重新启动了rabbitmq服务器。

b)宣布交换

Map<String,Object> props = new HashMap<String,Object>();

props.put("x-delayed-type", "direct");

this.automationExchange = new DirectExchange(exchangeName,true,false, props);

c)将消息推送为

DefaultClassMapper typeMapper = QueueUtils.classMapper;
typeMapper.setDefaultType(type);

Jackson2JsonMessageConverter converter = QueueUtils.converter;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
converter.setClassMapper(typeMapper);

RabbitTemplate template = AMQPRabbitMQTemplate.getAMQPTemplate();
template.setMessageConverter(converter);

template.convertAndSend(routingKey, message, new MessagePostProcessor() {

    @Override
    public Message postProcessMessage(Message m) throws AmqpException {
        m.getMessageProperties().setDelay(delayMiliSeconds);
        m.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
        return m;
    }
});

现在正在打印消息

public void onMessage(Message message, Channel channel) throws Exception{
    System.out.println(message.getMessageProperties().getDelay());
    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}

getDelay打印为null,理想情况下应根据https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq设置为负值。

如果我做错了,请告诉我。 我正在使用1.6.8.RELEASE版本的spring-amqp和spring-rabbit。

1 个答案:

答案 0 :(得分:0)

为了避免标头从入站邮件意外传播到出站邮件,入站邮件的某些标头由MessageProperties.getReceived...方法提供。

在这种情况下,标题位于MessageProperties.getReceivedDelay()

在向管理员声明之前,您还需要setDelayed(true)上的automationExchange

我认为您已将交换设置为RabbitTemplate中的默认值。