在MessageDrivenBean中为重新传递的消息指定DeadLetterQueue

时间:2017-05-18 14:44:28

标签: java-ee jms activemq message-driven-bean

我创建了一个从ActiveMQ中读取消息的MDB

@MessageDriven(name = "MessageReaderEJB",
    activationConfig = {
            @ActivationConfigProperty(propertyName = "acknowledgeMode",
                    propertyValue = "Auto-acknowledge"),
            @ActivationConfigProperty(propertyName = "destinationType",
                    propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty(propertyName = "destination",
                    propertyValue = "archive.>")

    })

@Slf4j
public class ArchiveMessageListenerBean implements MessageListener {
   ...
   @Override
   public void onMessage(Message inMessage) {
   ...
   }
   ...
}

和我的glassfish-ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish 
Application Server 3.1 EJB 3.1//EN"
    "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<enterprise-beans>
    <ejb>
        <ejb-name>MessageReaderEJB</ejb-name>
        <mdb-connection-factory>
            <jndi-name>jms/jms.connectionFactory</jndi-name>
        </mdb-connection-factory>
        <mdb-resource-adapter>
            <resource-adapter-mid>ActiveMQ-Resource-Adapter-5.14.1</resource-adapter-mid>
        </mdb-resource-adapter>

    </ejb>
</enterprise-beans>
</glassfish-ejb-jar>

如果在onMessage()中抛出异常,则会有一些重新发送并且在最大值之后。重新传递消息将发送到ActiveMQ.DLQ。 如何配置消息将发送到my.error.queue而不是ActiveMQ.DLQ?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您只能为给定的队列或主题指定特定的死信队列前缀。 如果要根据JMSDestination消息头将消息从DLQ路由到另一个消息,可以使用Camel。

  

代理传输他喜欢的默认传递策略   客户端连接在他的BrokerInfo命令包中。但客户可以   使用。覆盖策略设置    ActiveMQConnection.getRedeliveryPolicy()方法:

RedeliveryPolicy policy = connection.getRedeliveryPolicy();
policy.setInitialRedeliveryDelay(500);
policy.setBackOffMultiplier(2);
policy.setUseExponentialBackOff(true);
policy.setMaximumRedeliveries(2);
  

一旦邮件的重新传递尝试超过maximumRedeliveries   配置为重新传送策略,发送回“毒药确认”   经纪人让他知道这条消息被认为是毒药   丸。然后经纪人接收消息并将其发送到死信   排队以便稍后进行分析。

     

ActiveMQ中的默认死信队列称为ActiveMQ.DLQ;所有   无法传递的消息将被发送到此队列,这可以是   难以管理。因此,您可以设置individualDeadLetterStrategy   在activemq.xml配置文件的目标策略映射中,   它允许您为a指定特定的死信队列前缀   给定队列或主题。您可以使用外卡来应用此策略   你喜欢这样所有的队列都有自己的死信队列   如下例所示。

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

有关策略的更多详细信息,请参阅“重新传递策略”部分   选项。

http://activemq.apache.org/message-redelivery-and-dlq-handling.html