activemq - 为死信队列中的消息设置 individualDeadLetterStrategy、sharedDeadLetterStrategy 和过期时间

标签 activemq broker

我想设置以下内容

  1. 用于为每个队列设置 DL 队列前缀的individualDeadLetterStrategy
  2. sharedDeadLetterStrategy 用于禁止处理 DL 队列中的过期消息
  3. 为 DL 队列中的消息设置过期时间

关注dl-queue-handling ,我想出了以下不起作用的片段

  <destinationPolicy>
        <policyMap>
          <policyEntries>

            <policyEntry queue=">">
              <deadLetterStrategy>
                <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
              </deadLetterStrategy>
            </policyEntry>

            <policyEntry queue=">">
              <deadLetterStrategy>
                <sharedDeadLetterStrategy processExpired="false" />
              </deadLetterStrategy>
            </policyEntry>

            <policyEntry queue="CommandQueue">
              <deadLetterStrategy>
                <expiration="600000" />
              </deadLetterStrategy>
            </policyEntry>

          </policyEntries>
        </policyMap>
    </destinationPolicy>

错误: 类路径资源 [activemq.xml] 中的 XML 文档无效;嵌套异常是 org.xml.sax.SAXParseException;行号:74;列数:32;元素类型“expiration”后面必须跟有属性规范“">”或“/>”

其中 lineNumber: 74 对应于上面代码段中的 行。

或者,我假设给定队列名称的所有策略都应位于同一 policyEntry 下,因此我也尝试了以下代码片段:

  <destinationPolicy>
        <policyMap>
          <policyEntries>

            <policyEntry queue=">">
              <deadLetterStrategy>
                <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
                <sharedDeadLetterStrategy processExpired="false" />
              </deadLetterStrategy>
            </policyEntry>

            <policyEntry queue="CommandQueue">
              <deadLetterStrategy>
                <expiration="600000" />
              </deadLetterStrategy>
            </policyEntry>

          </policyEntries>
        </policyMap>
    </destinationPolicy>

错误: 原因:来自类路径资源 [activemq.xml] 的 XML 文档中的第 63 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号:63;列数:72; cvc-complex-type.2.4.d:发现以元素“sharedDeadLetterStrategy”开头的无效内容。此时不需要子元素。

其中第 63 行对应于:sharedDeadLetterStrategy processExpired="false"

最佳答案

正如您引用的文档中所述,过期是一个属性。它不能单独存在于标签中。这是无效的 XML。您应该在您的individualDeadLetterStrategy上设置此项。

此外,您还可以在 individualDeadLetterStrategy 上设置 processExpired="false"

试试这个:

<destinationPolicy>
  <policyMap>
    <policyEntries>

      <policyEntry queue=">">
        <deadLetterStrategy>
          <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true" processExpired="false" expiration="600000"/>
        </deadLetterStrategy>
      </policyEntry>

    </policyEntries>
  </policyMap>
</destinationPolicy>

关于activemq - 为死信队列中的消息设置 individualDeadLetterStrategy、sharedDeadLetterStrategy 和过期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62957502/

相关文章:

spring-boot - Spring 启动 Artemis 嵌入式代理行为

java - ActiveMQ 在 Spring Boot 中延迟传递消息

filesystems - 具有共享文件系统的 ActiveMQ HA 选项

rabbitmq - 在 RabbitMQ 中哪个更昂贵,每个交换多个队列,还是多个交换和每个交换更少的队列?

timestamp - RabbitMQ 3.1.3 和丢失的时间戳头

java - Spring 启动和 RabbitMQ : Failed to connect to reactor. io.net.impl.netty.tcp.NettyTcpClient

java - 如何让 ActiveMQ/Camel 在完成后从队列中删除当前消息?

java - 如何删除activemq中的特定队列

java - Apache Camel 到底是如何处理 JMSReplyTo 的? Camel 什么时候隐式使用目的地?

windows - MQTT 代理窗口