我正在使用带有rabbitMQ的spring-boot,我想知道我是否可以使用RabbitTemplate使用每个消息TTL。到目前为止,我有:
@Autowired
private RabbitTemplate rabbit;
public void produce() {
rabbit.convertAndSend("My.Queue", routingKey, message);
}
答案 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());