2014-06-16 20 views
7

Attualmente sto lavorando a un progetto di implementazione di coniglio-amqp e utilizzo spring-rabbit per impostare in modo programmatico tutte le mie code, associazioni e scambi. (spring-rabbit-1.3.4 e spring-framework versioni 3.2.0)Aggiunta dinamica di nuove code, binding e scambi come bean

La dichiarazione in una classe javaconfiguration o in una configurazione basata su xml sono entrambe abbastanza statiche secondo me dichiarate. So come impostare un valore più dinamico per una coda, lo scambio o vincolante come questo (ad esempio un nome.):

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

Ma mi chiedevo se fosse possibile creare un indefinito istanze quantità di coda e registrarli come fagioli come una fabbrica registrando tutte le sue istanze.

Io non sono molto familiare con la Primavera di annotazione @Bean ed i suoi limiti, ma ho provato

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

E per vedere se sono registrate le istanze multiple fagioli di coda che io chiamo:

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

Ma questo restituisce solo 1 mappatura:

name of the method := the last created instance. 

E 'possibile Dynamica aggiungere i bean durante il runtime a SpringApplicationContext?

+0

Sembra un compito JMX. – chrylis

risposta

6

È possibile aggiungere i fagioli in modo dinamico al contesto:

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

ma non saranno dichiarati dall'amministratore automaticamente; dovrai chiamare admin.initialize() per forzare la ripetizione di tutti gli elementi AMQP nel contesto.

Non si farebbe nessuno di questi in @Bean s, solo normale codice java di runtime.

+0

Grazie, questo mi ha aiutato molto. – JustinV

+0

@Gary E riguardo l'uso di 'addQueues' in caso di avvio a molla. Potresti estendere la tua risposta e spiegare i dettagli in caso di "spring-boot", per favore? –

+0

'addQueues' li aggiunge solo al contenitore, non li farà dichiarare sul broker; devono essere nel contesto per quello. In un'applicazione di avvio, è possibile ottenere un riferimento al contesto dell'applicazione da '@ Autowired' ing o nel metodo' main' con 'Contesto ConfigurableApplicationContext = SpringApplication.run (Application.class, args);'. –