如何使用RabbitTemplate设置每条消息TTL?

时间:2017-08-31 16:58:23

标签: java spring spring-boot rabbitmq

我正在使用带有rabbitMQ的spring-boot,我想知道我是否可以使用RabbitTemplate使用每个消息TTL。到目前为止,我有:

@Autowired
   private RabbitTemplate rabbit;

   public void produce() {

      rabbit.convertAndSend("My.Queue", routingKey, message);
   }

3 个答案:

答案 0 :(得分:2)

您可以创建MessagePostProcessor并在rabbitTemplate中使用它:

final String message = "message";
final MessagePostProcessor messagePostProcessor = new MyMessagePostProcessor(10000);
rabbitTemplate.convertAndSend("my.queue", "routingKey", message, messagePostProcessor);

这将抓住您的消息,应用更改并进一步发送。

public class MyMessagePostProcessor implements MessagePostProcessor {

    private final Integer ttl;

    public MyMessagePostProcessor(final Integer ttl) {
        this.ttl = ttl;
    }

    @Override
    public Message postProcessMessage(final Message message) throws AmqpException {
        message.getMessageProperties().getHeaders().put("expiration", ttl.toString());
        return message;
    }
}

答案 1 :(得分:1)

只是有一点解决方法:

@Autowired
   private RabbitTemplate   rabbit;

   @Autowired
   private MessageConverter jsonMessageConverter;

   public void produce() {

      rabbit.setExchange("My.Exchange");
      rabbit.setRoutingKey("R.K");
      rabbit.setMessageConverter(jsonMessageConverter);
      MessageProperties props = new MessageProperties();
      props.setExpiration(Long.toString(expiration));
      Message toSend = new Message(message.toString().getBytes(), props);
      rabbit.send(toSend);
   }

答案 2 :(得分:1)

如果您要使用 MessagePostProcessor 解决方案,您应该向消息添加属性而不是标题。

message.getMessageProperties().setExpiration(ttl.toString());