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



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

我的应用程序使用camel上下文进行路由和bean定义。我看过http://activemq.apache.org/message-redelivery-and-dlq-handling.html我不知道如何实施个人的DeadLetterStrategy。

我想尝试创建一个重新交付策略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 中

您提到的页面解释了如何在broker配置中配置DLQ。

例如,来自上述页面的此配置配置代理,以便名为MyMessageQueue的队列的不可交付消息进入DLQ.MyMessageQueue,而不是标准ActiveMQ.DLQ

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

目的地通配符queue=">"可能不太清楚,意思是"所有队列"。有关这些通配符的说明,请参阅本页。

由于目标配置是在这些通配符的帮助下完成的,因此建议以允许您使用这些通配符对具有特殊配置需求的目标进行"分组"的方式命名队列和主题。

在最新版本的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

最新更新