当前位置: 首页 > 知识库问答 >
问题:

如何将activemq队列配置为不使用过期邮件的默认死信队列

吕文林
2023-03-14

我正在尝试实现一个策略,当activemq队列中的消息过期时,不会被移动到默认的死信队列ActiveMQ。DLQ,他们会去另一个死信队列。

我的应用程序使用camel-context进行路由和bean定义。我看了http://ActiveMQ . Apache . org/message-re delivery-and-dlq-handling . html,不确定如何实现individualDeadLetterStrategy。

我想尝试创建一个重新交付策略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中保留过期消息

共有2个答案

裴姚石
2023-03-14

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

贲俊才
2023-03-14

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

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

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

可能不是很清楚是目标通配符队列=”

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

 类似资料:
  • 我有一个使用Spring Cloud Streams-RabbitMQ在微服务中交换消息的项目。对我的项目至关重要的一件事是,我不能丢失任何信息。 null 我是这些框架的新手,我希望你能帮助配置我的...

  • Azure Service Bus中死信队列中的邮件是否过期? 我有这些队列设置: 当我将某些消息放入Azure服务总线消息队列(不是Azure存储的队列)并且不使用它们(永远)时,它们将自动移动到死信队列。 然而,如果我也没有死信队列的消费者,这些消息会从死信队列中删除还是永远留在那里?(是否有一些官方文件说明这是如何工作的?) 在我的试验中,我在队列中放置了3条消息。大约两分钟后,他们就死了。

  • 我正在使用死信频道EIP与骆驼文件中描述的死信频道完全相同。这是我的camel.xml(删除头) 我只有一条路由具有基于内容的路由器,其实质是,如果消息体具有getInfo,则从jms:foo路由到jms:getInfo,如果消息体具有performAction,则从jms.foo路由到jms:performAction 我预计,当jms:getInfo使用者没有运行时,交付将失败,重新交付尝试将

  • 我有一个现有的AWS Lambda(通过CloudFormation创建),现在我想修改它,使它有一个死信队列。本质上,这允许我重新配置Lambda,这样,如果它在执行期间无法处理/使用SQS消息,AWS将自动将消息发布到我选择的“死信队列”(DLQ)。 我一辈子都想不出该怎么加上: 我的Lambdas CF配置,如上面链接的文章所示。我能做的最接近的事情是: 在Lambdas主页上选择“管理此堆