2014-06-16 17 views
7

Ich arbeite derzeit an einem Hase-amqp-Implementierungsprojekt und verwenden Sie Spring-Rabbit, um alle meine Warteschlangen, Bindungen und Austausche programmgesteuert einzurichten. (Spring-Rabbit-1.3.4 und Spring-Framework Versionen 3.2.0)Dynamisch neue Warteschlangen, Bindungen und Austausch als Beans hinzufügen

Die Deklaration in einer Java-Konfiguration-Klasse oder XML-basierte Konfiguration sind meiner Meinung nach ziemlich statisch erklärt. Ich weiß, wie ein dynamischer Wert setzen für eine Warteschlange, Austausch oder Bindung wie folgt aus (ex einen Namen.):

@Configuration 
public class serverConfiguration { 
    private String queueName; 
    ... 
    @Bean 
    public Queue buildQueue() { 
    Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments()); 
    buildRabbitAdmin().declareQueue(queue); 
    return queue; 
    } 
    ... 
} 

Aber ich frage mich, ob es möglich war, eine nicht definierte Menge Instanzen Queue zu erstellen und registrieren Sie sie als Bohnen wie eine Fabrik und registrieren Sie alle ihre Instanzen.

Ich bin nicht wirklich vertraut mit dem Spring @Bean Annotation und seine Grenzen, aber ich versuchte

@Configuration 
public class serverConfiguration { 
    private String queueName; 
    ... 
    @Bean 
    @Scope("prototype") 
    public Queue buildQueue() { 
    Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments()); 
    buildRabbitAdmin().declareQueue(queue); 
    return queue; 
    } 
    ... 
} 

Und zu sehen, ob die mehreren Bohnen Instanzen Queue registriert Ich nenne:

Map<String, Queue> queueBeans = ((ListableBeanFactory) applicationContext).getBeansOfType(Queue.class); 

Aber das wird wieder nur 1-Zuordnung:

name of the method := the last created instance. 

Ist es möglich, dynamica Hinzufügen von Beans während der Laufzeit zum SpringApplicationContext?

+0

Das klingt wie eine JMX-Aufgabe. – chrylis

Antwort

6

Sie Bohnen dynamisch Kontext hinzufügen:

context.getBeanFactory().registerSingleton("foo", new Queue("foo")); 

aber sie werden nicht automatisch vom Server-Betreiber erklärt werden; Sie müssen admin.initialize() aufrufen, um es zu zwingen, alle AMQP-Elemente im Kontext neu zu deklarieren.

Sie würden nicht beide in @Bean s, nur normale Laufzeit Java-Code.

+0

Danke, das hat mir sehr geholfen. – JustinV

+0

@Gary Was ist mit 'addQueues' im Falle von Spring-Boot. Könnten Sie bitte Ihre Antwort erweitern und Details im Fall von "Spring-Boot" erklären? –

+0

'addQueues' fügt sie nur dem Container hinzu, sie werden nicht auf dem Broker deklariert; Sie müssen im Kontext dafür sein. In einer Boot-Anwendung können Sie einen Verweis auf den Anwendungskontext erhalten, indem Sie '@ Autowired' oder in der 'main'-Methode mit' ConfigurableApplicationContext context = SpringApplication.run (Application.class, args); '. –

Verwandte Themen