繁体   English   中英

如何将activemq队列配置为不对过期消息使用默认的死信队列

[英]How can I configure an activemq queue to not use the default dead letter queue for expired messages

我正在尝试实施一种策略,其中当activemq队列中的消息过期时,它们将转到另一个死信队列,而不是移到默认的死信队列ActiveMQ.DLQ。

我的应用程序使用骆驼上下文进行路由和bean定义。 我已经看过http://activemq.apache.org/message-redelivery-and-dlq-handling.html ,但是我不确定如何实现personalDeadLetterStrategy。

我想尝试创建重新交付策略Bean并将其添加到我的连接工厂中,但在http://activemq.apache.org/redelivery-policy.html上看不到死信策略属性

我也考虑过使用错误处理程序,但我的用例不是错误情形。

我的问题是如何为单个队列配置/指定死信队列。

我已经将我的应用程序配置为产生像这样的队列

        <route id="myRoute">
            <from uri="direct:insertToQueue" />
            <doTry>
                <bean ref="processorBean" method="getQueueRequest"/>
                <to uri="activemqProducer:queue:myQueue" />
                <doCatch>
                    <exception>java.lang.Exception</exception>
                    <handled>
                        <constant>true</constant>
                    </handled>
                    <bean method="getExceptionResponse" ref="processorBean" />
                </doCatch>
            </doTry>
        </route>

activemq组件“ activemqProducer”的定义如下:

    <bean id="activemqProducer" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="configuration" ref="jmsConfigProducer"/>
    </bean>

    <bean id="jmsConfigProducer" class="org.apache.camel.component.jms.JmsConfiguration" scope="prototype">
        <property name="connectionFactory" ref="jmsFactoryProducer"/>
        <property name="transacted" value="false"/>
        <property name="deliveryPersistent" value="true"/>
        <property name="timeToLive" value="5000"/>
    </bean>

    <bean id="jmsFactoryProducer" class="org.apache.activemq.pool.PooledConnectionFactory"
          init-method="start" destroy-method="stop" scope="prototype">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
        <property name="maxConnections" value="${jms.maximum.connection}" />
        <property name="maximumActiveSessionPerConnection" value="${jms.maximum.active}" />
    </bean>

    <bean id ="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL"><value>${message.broker}</value></property>
        <property name="userName"><value>${message.broker.username}</value></property>
        <property name="password"><value>${message.broker.password}</value></property>
        <property name="optimizeAcknowledge" value="true"/>

        <property name="useAsyncSend" value="true" />
    </bean>

如何为myQueue包括单个死信队列的配置。 如果那不可能,那么我如何告诉activemq将过期的消息保留在myQueue中

在最新版本的ActiveMQ(例如Artemis)中,有一种方法可以定义不同的到期地址(取决于队列名称上的正则表达式):

<address-setting match="com.company.demo.MyQueue">
   <expiry-address>com.company.demo.EXP.MyQueue</expiry-address>
</address-setting>

有关更多信息, 访问: https : //activemq.apache.org/artemis/docs/latest/message-expiry.html

您提到页面说明了如何在代理配置中配置DLQ。

例如,从提到的页面获取的此配置将配置代理,以便名为MyMessageQueue的队列的不可传递消息进入DLQ.MyMessageQueue而不是标准ActiveMQ.DLQ

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

目标通配符 queue=">"可能并不十分清楚,它表示“所有队列”。 有关这些通配符的说明,请参见本页

由于目标配置是借助这些通配符完成的,因此建议以一种允许您将具有特殊配置需求的目标“分组”到这些通配符的方式对队列和主题进行命名

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM