[英]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
例如,從提到的頁面獲取的此配置將配置代理,以便名為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.