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

7y4bm7vi  于 2023-04-28  发布在  Spring
关注(0)|答案(4)|浏览(206)

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

@Autowired
   private RabbitTemplate rabbit;

   public void produce() {

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

ie3xauqp1#

您可以创建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;
    }
}
vfh0ocws

vfh0ocws2#

只是有一个小的变通办法:

@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);
   }
eh57zj3b

eh57zj3b3#

如果你要使用MessagePostProcessor解决方案,你应该在你的邮件中添加属性而不是头。

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

fzsnzjdm4#

rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE,
                    RabbitMqConfig.RK,
                    String.valueOf(body),
                    message -> {
              message.getMessageProperties().setExpiration(String.valueOf(1000));
                        return message;
                    });

相关问题