Nein; Wir müssen eine Reihe von Gerüsten hinzufügen, um Rückgaben zu unterstützen. Außerdem werden Kanäle zwischengespeichert und es gibt keine Möglichkeit, die Bestätigung für einen einmal eingestellten Kanal abzuschalten. Wir müssten 2 verschiedene Caches behalten.
Wenn Sie bedingte Bestätigungen verwenden möchten, können Sie zwei Verbindungsfactorys (und Vorlagen) definieren, eine mit Bestätigungen aktiviert, eine nicht und die zur Laufzeit zu verwendende Vorlage auswählen.
EDIT
@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;
}
}
Wie wäre es einfach ignorieren bestätigt für die bestimmte Nachrichten? –
Sobald die Verbindung erstellt wurde, ist die Kosten für die Bestätigung einer Nachricht noch vorhanden, auch wenn Sie die Bestätigung ignorieren. Wie @Gary vorgeschlagen, ich habe versucht, 2 Verbindungen zu verwenden – basu76