有没有办法更改每封邮件的发布商确认?我们有一个rest层接收消息并发布到RabbitMQ。根据某些消息属性,我们决定是否需要发布者确认。
有没有办法在发送消息时覆盖发布者确认?
答案 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;
}
}