【问题标题】:How to set expiry for specific ActiveMQ queue如何为特定的 ActiveMQ 队列设置过期时间
【发布时间】:2022-06-10 23:37:43
【问题描述】:

ActiveMQ 的文档让我很难过,所以你是我最后的希望:D

我想要什么:
传出队列中消息的到期日期。传入、DLQ 和 RTS 队列中的消息应该永远保留。

所以过期始终是0,除非将消息放入传出队列。然后 ActiveMQ 必须设置一个新的到期日。或者,这也可以由应用程序设置

或者(也许更容易):
传出和传入队列中消息的到期日期。 DLQ 和 RTS 队列中的消息应该永远保留。

所以过期总是12345(或左右),除非消息传输到 RTS 或 DLQ。然后 ActiveMQ 必须将新的过期日期设置为0

我尝试了什么:

  1. 在 应用程序message.setJMSExpiration(XYZ); 然而, 然后到期日期始终设置为0。可能是因为 spring jms 库
  2. 配置 deadLetterStrategy 使 DLQ 中的所有消息的过期时间为 0。但是好像没有效果。可能配置错误

<deadLetterStrategy>
    <individualDeadLetterStrategy
            processNonPersistent="true"
            queuePrefix="DLQ."
            useQueueForQueueMessages="true"
            processExpired="false"
            expiration="0"/>
</deadLetterStrategy>

也许你可以帮助我:)
提前谢谢你

Spring-jms:5.3.20
ActiveMQ:5.15.15

【问题讨论】:

    标签: spring queue activemq spring-jms dlq


    【解决方案1】:

    JMS 消息 setJMSExpiration 被明确记录为供用户使用的位,从而解释了为什么调用它对您不起作用。

    此方法仅供 JMS 提供者使用,仅用于在发送消息时设置此字段。客户端不能使用此消息来配置消息的过期时间。此方法是公共的,以允许 JMS 提供者在发送不是其自己的实现的消息时设置此字段。

    要定义消息的生存时间,您需要使用 JMS Producer 方法 setTimeToLive 或允许您为每条消息提供 TTL 值的 send 方法。

    或者,您可以配置 ActiveMQ Timestamp Plugin 以将 TTL 值应用于每条传入消息。

    如果您希望过期消息进入 DLQ,那么我建议您不要像上面那样通过设置 processExpired="false" 将代理配置为不这样做,因为这专门告诉代理不要 DLQ 过期消息。

    【讨论】:

    • 感谢您的回答 :) 但目前我的消息如果有 TTL 将被删除。这正常吗?我的目标是,当达到 TTL 时,将消息放入 DLQ 并赋予新的 0 TTL,或者换句话说,当消息在 DLQ 中时,它永远不会被删除。也许这是默认行为,我在配置中搞砸了。你能告诉我默认行为吗?
    • 您是发送到主题还是队列?
    • 对双方。流程如下:Some Service X -> Send to topic -> Send to 3 Queues -> Service for each queue -> Send to Queue
    • 尝试将 processExpired 设置为 true,否则您已禁用 DLQ 的过期消息处理
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2012-07-03
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多