我正在尝试使用延迟交换插件,但不知何故它不适用于我并且消息会立即收到。
我尝试了以下事项:
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。
答案 0 :(得分:0)
为了避免标头从入站邮件意外传播到出站邮件,入站邮件的某些标头由MessageProperties.getReceived...
方法提供。
在这种情况下,标题位于MessageProperties.getReceivedDelay()
。
在向管理员声明之前,您还需要setDelayed(true)
上的automationExchange
。
我认为您已将交换设置为RabbitTemplate
中的默认值。