spring-amqp RabbitMQ动态更改发布者确认

时间:2016-12-13 22:25:09

标签: rabbitmq spring-amqp

有没有办法更改每封邮件的发布商确认?我们有一个rest层接收消息并发布到RabbitMQ。根据某些消息属性,我们决定是否需要发布者确认。

有没有办法在发送消息时覆盖发布者确认?

1 个答案:

答案 0 :(得分:0)

没有;我们必须添加一堆脚手架来支持返回。此外,通道被缓存,一旦设置,无法关闭通道的确认。我们必须保留2个不同的缓存。

如果您希望使用条件确认,您可以定义两个连接工厂(和模板),一个启用确认,一个不启用,并选择在运行时使用哪个模板。

修改

@SpringBootApplication
public class So41131612Application {

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(So41131612Application.class, args);
        context.getBean("normalTemplate", RabbitTemplate.class).convertAndSend("foo", "foo");
        context.getBean("confirmingTemplate", RabbitTemplate.class).convertAndSend("", "foo", "foo",
                new CorrelationData("foo"));
        Thread.sleep(2000);
        context.getBean(RabbitAdmin.class).deleteQueue("foo");
        context.close();
    }

    @Bean
    public Queue foo() {
        return new Queue("foo");
    }

    @Bean
    @Primary
    public CachingConnectionFactory rabbitConnectionFactory() {
        return new CachingConnectionFactory("localhost");
    }

    @Bean
    public CachingConnectionFactory confirmingCf() {
        CachingConnectionFactory cf = new CachingConnectionFactory("localhost");
        cf.setPublisherConfirms(true);
        return cf;
    }

    @Bean
    public AmqpTemplate normalTemplate(@Qualifier("rabbitConnectionFactory") CachingConnectionFactory normalCf) {
        return new RabbitTemplate(normalCf);
    }

    @Bean
    public AmqpTemplate confirmingTemplate(@Qualifier("confirmingCf") CachingConnectionFactory confirmingCf) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(confirmingCf);
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setConfirmCallback((cd, ack, cause) -> {
            System.out.println("Correlation:" + cd + " ack: " + ack);
        });
        return rabbitTemplate;
    }

}