Spring JMS - activemq - 未使用个人 DLQ

Spring JMS - activemq - individualDLQ not used

我正在尝试为 activemq 设置 spring JMS,我希望使用单独的 DLQ 以便于监控,而不是将所有内容集中在一个 DLQ 上。

然而,我的豆子似乎没有被捡起。谁能指出我做错了什么,因为文档对如何以编程方式执行此操作非常模糊?

我的队列配置:

@Bean
public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    return converter;
}

@Bean
public DeadLetterStrategy deadLetterStrategy() {
    IndividualDeadLetterStrategy deadLetterStrategy = new IndividualDeadLetterStrategy();
    deadLetterStrategy.setQueueSuffix(".dlq");
    return deadLetterStrategy;
}

@Bean
public RedeliveryPolicy redeliveryPolicy() {
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setInitialRedeliveryDelay(5000);
    redeliveryPolicy.setBackOffMultiplier(2);
    redeliveryPolicy.setUseExponentialBackOff(true);
    redeliveryPolicy.setMaximumRedeliveries(5);
    return redeliveryPolicy;
}

@Bean
public Queue myQueue() {
    ActiveMQQueue queue = new ActiveMQQueue("myQueue");
    return queue;
}

您可以使用像这样的配置来应用个人死信策略

@Bean
DeadLetterStrategy deadLetterStrategy(){

    IndividualDeadLetterStrategy dlq = new IndividualDeadLetterStrategy();      //Messages of each will get to their respective Dead Letter Queues. if Original queue = 'x', its DLQ = 'prefix + x'
    dlq.setQueueSuffix(".dlq");
    dlq.setUseQueueForQueueMessages(true);

    return dlq;
}

@Bean
    public BrokerService brokerService(@Autowired DeadLetterStrategy strategy) throws Exception {
        BrokerService broker = new BrokerService();
        TransportConnector connector = new TransportConnector();
        connector.setUri(new URI("your broker url")); //default/embedded broker url: vm://localhost?broker.persistent=true
        broker.addConnector(connector);

        PolicyEntry entry = new PolicyEntry();
        entry.setDestination(new ActiveMQQueue("*"));           //given DeadLetterStrategy will be applied to all types of Queues; ',' can also be used
        entry.setDeadLetterStrategy(strategy);
        PolicyMap map = new PolicyMap();
        map.setPolicyEntries(Arrays.asList(entry));
        broker.setDestinationPolicy(map);

        return broker;
    }

最后你的队列应该是这样的:

@JmsListener(destination = "main_queue_name" + ".dlq")
    protected void processFailedItem(YourCustomPojo data) {
        //do whatever you want
    }