我创建了一个从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?
感谢您的帮助!
答案 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