2016-12-13 1 views
0

Gibt es eine Möglichkeit, Herausgeber-bestätigt pro Nachricht zu ändern? Wir haben eine Ruhe-Schicht, die die Nachricht empfängt und an RabbitMQ veröffentlicht. Basierend auf bestimmten Nachrichteneigenschaften entscheiden wir, ob die Bestätigung des Publishers erforderlich ist oder nicht.spring-amqp RabbitMQ dynamisch wechseln Herausgeber-bestätigt

Gibt es eine Möglichkeit zum Überschreiben, bestätigt der Herausgeber beim Senden der Nachricht?

+0

Wie wäre es einfach ignorieren bestätigt für die bestimmte Nachrichten? –

+0

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

Antwort

0

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; 
    } 

} 
+0

Danke Garry, Das ist, was ich versuchte, vor dem Posten, aber lief in Probleme. Wie verwenden wir verschiedene Konfigurationseigenschaften für jedes dieser ConnectionFactories? Ist eine Probe verfügbar? Ich verwende Java Config – basu76

+0

Ich bin nicht sicher, was "Probleme" Sie hatten, aber ich habe eine Beispiel-Boot-App hinzugefügt und es funktioniert in Ordnung für mich. –

Verwandte Themen