2017-11-01 1 views
1

Ich bin in der Lage, eine Warteschlange zu mehreren Börsen mit der RabbitListener Annotation zu binden, aber bisher waren nicht erfolgreich.RabbitListener Binding Queue an mehrere Börsen

Was ich jetzt habe, ist:

@RabbitListener(bindings = @QueueBinding(value = 
    @Queue(
     value = "${subscriber.queueInbound}", durable = "true", autoDelete = "false", exclusive = "false"), 
     exchange = @Exchange(value = "all", durable = "true") 
    ), 
    containerFactory = "subscriberRabbitListenerContainerFactory" 
) 
public void onMessage(Message message, Channel channel) { 
    // do something 
} 

Dies wird auf die Start/Wieder connect Auto die Warteschlange als subscriber.queueInbound und binden diese Warteschlange auf einen Standard all Austausch definiert erstellen.

Ich habe dann einen Job, der im Hintergrund ausgeführt wird, der dann diese Warteschlange ordnungsgemäß konfiguriert und an die verschiedenen Vermittlungsstellen bindet, für die sie konfiguriert werden muss.

Ich suche nach einer eleganteren Art, dies entweder durch die @RabbitListener zu tun oder irgendwie zu justieren, so dass es bei erneuter Verbindung die Warteschlange entsprechend vor dem erneuten Anhören konfigurieren muss.

Ursprünglich habe ich die Queue-Konfiguration über Beans gemacht, aber dies verhinderte den Start der Anwendung, wenn RabbitMQ nicht verfügbar war, aber ich würde es starten und die Warteschlangenkonfigurationsschritte nicht ausführen.

Antwort

0
@RabbitListener(bindings = { 
     @QueueBinding(value = 
      @Queue(value = "foo"), exchange = @Exchange("ex1"), key="foo"), 
     @QueueBinding(value = 
      @Queue(value = "foo"), exchange = @Exchange("ex2"), key="bar") 
}) 
public void listen(String in) { 

} 

Ursprünglich die Warteschlange Konfiguration durch Beans aber dies verhindert ich tat Start der Anwendung, wenn RabbitMQ nicht verfügbar war, was ich beschlossen, aber würde dann darin die Inbetriebnahme und die Warteschlange Konfigurationsschritte nicht ausgeführt werden.

Das bedeutet, dass Sie während der Kontextinitialisierung etwas "Illegales" taten. Sie sollten nicht versuchen, mit RabbitMQ zu sprechen, bis der Kontext vollständig aufgebaut ist.

Bohnen werden erst beim ersten Öffnen der Verbindung auf dem Broker deklariert.

+0

Ja, ich erkannte meinen Fehler und arbeite daran, es zu korrigieren, jedoch sollte der Austausch, den ich konfiguriere, klarer werden, da er von einer Konfigurationsdatei kommt, so dass ich nicht weiß, wie viele '@ QueueBinding' Setup bis zur Laufzeit. – Welsh

+0

Dann kann es nicht mit der Anmerkung gemacht werden; während die einfachere Eigenschaft 'queues' SpEL verwenden kann, um eine' String [] ', z. '# {'$ {some.prop}'. split (',')}' Die '@ QueueBinding' Annotation ist zu komplex, um so etwas zu implementieren. –

Verwandte Themen