2017-08-31 5 views
1

私はrabbitMQでspring-bootを使用していますが、RabbitTemplateを使用してメッセージごとにTTLを使用できるかどうかは疑問です。これまでのところ私が持っている:RabbitTemplateでメッセージごとのTTLを設定するには?

@Autowired 
    private RabbitTemplate rabbit; 

    public void produce() { 

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

答えて

1

あなたは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; 
    } 
} 
+0

を、ユアーズはもっときれいです。ありがとう@ByeBye – Khodabakhsh

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); 
    } 
関連する問題