问题描述
这是一个相当简单的问题...我有一个spring项目,在其中使用队列(消费)。 现在,我想为正在使用的每个队列配置单个死信队列。
但是,在我看来,单个死信队列配置必须在代理服务(SERVER)中完成,而不是在CONSUMER中完成。真的是这样吗?
我下面的代码将不起作用,对吗?
@Bean public DeadLetterStrategy deadLetterStrategy(){ IndividualDeadLetterStrategy dlq = new IndividualDeadLetterStrategy(); dlq.setQueueSuffix(".DLQ"); dlq.setUseQueueForQueueMessages(true); return dlq; } @Bean public ActiveMQConnectionFactory consumerActiveMQConnectionFactory() { var activeMQConnectionFactory = new ActiveMQConnectionFactory(); activeMQConnectionFactory.setbrokerURL(brokerUrl); RedeliveryPolicy policy = activeMQConnectionFactory.getRedeliveryPolicy(); policy.setMaximumRedeliveries(maximumRedeliveries); policy.setinitialRedeliveryDelay(0); policy.setBackOffMultiplier(3); policy.setUseExponentialBackOff(true); return activeMQConnectionFactory; } @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { var factory = new DefaultJmsListenerContainerFactory(); factory.setSessionAckNowledgeMode(JmsProperties.AckNowledgeMode.CLIENT.getMode()); factory.setConcurrency(factoryConcurrency); factory.setConnectionFactory(consumerActiveMQConnectionFactory()); return factory; } @Bean public brokerService broker() throws Exception { final brokerService broker = new brokerService(); broker.addConnector(brokerUrl); broker.setPersistent(false); broker.setDestinationPolicy(policyMap()); return broker; } @Bean public PolicyMap policyMap() { PolicyMap destinationPolicy = new PolicyMap(); List<PolicyEntry> entries = new ArrayList<PolicyEntry>(); PolicyEntry queueEntry = new PolicyEntry(); queueEntry.setQueue(">"); // In activemq '>' does the same thing as '*' does in other languages queueEntry.setDeadLetterStrategy(deadLetterStrategy()); entries.add(queueEntry); destinationPolicy.setPolicyEntries(entries); return destinationPolicy; } }
@JmsListener(destination = "myqueue")
public void onMessage(Message message,Session session) throws JMSException {
try {
stuff()
message.ackNowledge();
} catch (Exception ex) {
session.recover();
}
}
解决方法
ActiveMQ 5.x中的JMS使用者无法配置代理方死信策略,必须在配置XML中的代理处或通过编程代理配置来完成。如果您的代理只是一个内存中的代理,则可以像在春季那样配置它,但是对于大多数应用程序来说它很少用。
有关代理配置的更多帮助,请参考broker documentation。