2014-06-16 5 views
7

जोड़ें, मैं वर्तमान में खरगोश-एएमपीपी कार्यान्वयन प्रोजेक्ट पर काम कर रहा हूं और मेरी सभी कतारों, बाइंडिंग और एक्सचेंजों को प्रोग्रामेटिक रूप से सेटअप करने के लिए वसंत-खरगोश का उपयोग कर रहा हूं। (वसंत-खरगोश-1.3.4 और वसंत-ढांचे के संस्करण 3.2.0)गतिशील रूप से नई कतार, बाइंडिंग और एक्सचेंजों को बीन्स

एक जैवकॉन्फ़िगरेशन कक्षा या एक्सएमएल-आधारित कॉन्फ़िगरेशन में घोषणा मेरी राय में काफी स्थिर है। मैं कैसे एक अधिक गतिशील मान सेट करने जानते एक कतार, विनिमय या इस तरह बंधन के लिए (पूर्व एक नाम है।):

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

लेकिन अगर यह संभव हो गया था कतार का एक अपरिभाषित राशि उदाहरणों बनाने के लिए मैं सोच रहा था और उन्हें अपने सभी उदाहरणों को पंजीकृत करने वाले कारखाने की तरह सेम के रूप में पंजीकृत करें।

मैं वसंत @Bean एनोटेशन और अपनी सीमाओं के साथ वास्तव में परिचित नहीं हूँ, लेकिन मैं

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

की कोशिश की और अगर कतार के कई सेम उदाहरणों पंजीकृत हैं मैं फोन को देखने के लिए:

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

लेकिन यह केवल 1 मानचित्रण वापस आ जाएगी:

name of the method := the last created instance. 

यह Dynamica करना संभव है स्प्रिंगएप्लिकेशन कॉन्टेक्स्ट में रनटाइम के दौरान लिली जोड़ें बीन्स?

+0

यह एक जेएमएक्स कार्य की तरह लगता है। – chrylis

उत्तर

6

आप संदर्भ के लिए गतिशील रूप से सेम जोड़ सकते हैं:

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

लेकिन वे स्वतः व्यवस्थापक द्वारा घोषित नहीं किया जाएगा; आपको संदर्भ में सभी AMQP तत्वों को फिर से घोषित करने के लिए मजबूर करने के लिए admin.initialize() पर कॉल करना होगा।

आप इनमें से कोई भी @Bean एस में नहीं करेंगे, केवल सामान्य रनटाइम जावा कोड।

+0

धन्यवाद, इससे मुझे बहुत मदद मिली। – JustinV

+0

@ गैरी वसंत-बूट के मामले में 'addQueues' का उपयोग करने के बारे में क्या है। क्या आप अपना उत्तर बढ़ा सकते हैं और 'वसंत-बूट' के मामले में विवरण समझा सकते हैं? –

+0

'addQueues' केवल उन्हें कंटेनर में जोड़ता है, इससे ब्रोकर पर उन्हें घोषित नहीं किया जाएगा; उन्हें इसके संदर्भ में होना चाहिए। बूट एप्लिकेशन में, आप '@ Autowired' आईएनजी द्वारा या 'कॉन्फ़िगर करने योग्य एप्लिकेशंस कॉन्टेक्स्ट संदर्भ = SpringApplication.run (Application.class, args) के साथ' मुख्य 'विधि में अनुप्रयोग संदर्भ का संदर्भ प्राप्त कर सकते हैं;'। –

संबंधित मुद्दे