我正在学习如何使用 Artemis 消息传递代理。在我的示例应用程序中,我正在应用生产者-消费者方案。我希望发送到队列的某些消息具有过期时间。我的示例应用程序是在 Spring Boot 中开发的。我使用以下方法发送消息:
public void send(JmsTemplate jmsTemplate, String queueName, String textMessage, long timeToLive) throws JMSException {
jmsTemplate.setTimeToLive(timeToLive);
jmsTemplate.convertAndSend(queueName, textMessage, new MessagePostProcessor() {
public Message postProcessMessage(Message message) throws JMSException {
message.setJMSExpiration(timeToLive);
return message;
}
});
}
我在broker.xml文件中定义了如下配置:
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
<auto-create-jms-queues>true</auto-create-jms-queues>
<auto-create-jms-topics>true</auto-create-jms-topics>
</address-setting>
使用此配置,即使我在 timeTolive 字段中设置的值不是 0,我也已通过管理控制台检查消息的 Expiry 字段设置为 0。我把broker.xml文件的配置修改成了这个:
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<expiry-delay>1000</expiry-delay>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
<auto-create-jms-queues>true</auto-create-jms-queues>
<auto-create-jms-topics>true</auto-create-jms-topics>
</address-setting>
</address-settings>
对于这种配置,情况正好相反。如果我将 timeToLive 字段设置为 0,则 Expiry 字段不会显示值 0,而是显示消息过期时间的时间戳。我不明白为什么。
你能给我一些解决这个问题的方向吗?是否可以按需设置消息是否具有关联的过期时间?
干杯