ActiveMQ中如何设置消息的最大存储时间?

ActiveMQ 中可以通过以下方式设置消息的最大存储时间:

  1. Broker 端设置全局消息最大存储时间:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost"  
      dataDirectory="${activemq.data}">  

  <destinationPolicy>
    <policyEntry queue=">"> 
      <messageExpirationStrategy>
        <timeRelativeExpirationStrategy 
                  expirationPeriod="3600000" />  
      </messageExpirationStrategy>
    </policyEntry>
  </destinationPolicy>
</broker>  

此设置将限制 Broker 中所有队列的消息最大存储时间为 1 小时(3600000 毫秒)。超过此时间的消息将被丢弃。

  1. Broker 端设置指定队列消息最大存储时间:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost"  
      dataDirectory="${activemq.data}">  

  <destinationPolicy>
    <policyEntry queue="queue1">  
      <messageExpirationStrategy>
        <timeRelativeExpirationStrategy 
                  expirationPeriod="10000" />  
      </messageExpirationStrategy>
    </policyEntry> 
  </destinationPolicy>
</broker>

此设置将限制 queue1 这个队列的消息最大存储时间为 10 秒。

  1. 生产者端限制发送消息的最大存储时间:
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://broker:61616");  
Connection conn = cf.createConnection();
conn.start();  

Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);  
MessageProducer producer = sess.createProducer(sess.createQueue("queue1"));

producer.setTimeToLive(20000); // 20秒过期
producer.setDeliveryMode(DeliveryMode.PERSISTENT); // 持久化消息  

producer.send(sess.createTextMessage("Hello"));  

设置 producer 的 timeToLive 即可限制其发送的消息最大存储时间。这里设置为 20 秒,所以消息如果在 20 秒内未被消费,Broker 会将其丢弃。