ActiveMQ 中可以通过以下方式设置消息的最大存储时间:
- 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 毫秒)。超过此时间的消息将被丢弃。
- 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 秒。
- 生产者端限制发送消息的最大存储时间:
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 会将其丢弃。