2014-07-23 11 views
5

मुझे प्रत्येक अनुरोध के लिए एक अलग एप्लिकेशन ईवेंट श्रोता पंजीकृत करने की आवश्यकता है। जबकि श्रोता के अनुरोध में आने के लिए सभी आवश्यक घटनाओं का इंतजार अवरुद्ध है श्रोता के उद्देश्य, अन्य बाकी अनुरोध से आ रही घटनाओं को पकड़ने के लिए हैअनुरोध-स्कोप्ड ApplicationEventListener ईवेंट प्राप्त करने में विफल रहता है

मैं इस जैसे कोड है:।

@Component 
// @Scope(WebApplicationContext.SCOPE_REQUEST) 
public static class WhistleEventListener implements ApplicationListener<WhistleEvent> { 
    volatile Consumer<WhistleEvent> handler; 
    @Override 
    public void onApplicationEvent(WhistleEvent we) { 
    final Consumer<WhistleEvent> h = handler; 
    if (h != null) h.accept(we); 
    } 
} 
@Autowired WhistleEventListener whistleEventListener; 

इस कोड को प्राप्त करता है घटनाएं, लेकिन जैसे ही मैं @Scope एनोटेशन को अनमोल करता हूं, यह ईवेंट प्राप्त करना बंद कर देता है।

अनुरोध-स्कोप्ड एप्लिकेशन इवेंट श्रोताओं समर्थित हैं, क्या वे काम करने के लिए हैं? यदि हां, तो क्या मैं अपना श्रोता काम करने के लिए कुछ कर सकता हूं?

उत्तर

1

मुझे लगता है आप यांत्रिकी भेजने आवेदन घटना के एक गलतफहमी है: घटना के संदर्भ में सेम के खिलाफ भेजा जाता है परिभाषाओं, नहीं सेम उदाहरणों, और प्रत्येक सेम परिभाषा पल में एक उदाहरण में हल हो गई है, और घटना प्रकाशन के। इसका अर्थ यह है कि आपका कार्यक्रम केवल अनुरोध से संबंधित अनुरोध-स्कोप्ड बीन को भेजा जाएगा जिसमें ईवेंट प्रकाशित प्रकाशित है, लेकिन आप के श्रोताओं को वर्तमान अनुरोधों को अधिसूचित करना चाहते हैं।

अधिक आम तौर पर, दायरे का उद्देश्य दायरे के उदाहरणों को अलग करना है, जिसमें अलग-अलग बीन उदाहरण होते हैं। यदि आप अलगाव नहीं चाहते हैं, तो आपको उस दायरे का उपयोग करना चाहिए जिसमें अलग-अलग उदाहरण नहीं हैं, उदाहरण के लिए एप्लिकेशन स्कोप। ,

@Component 
public class WhistleEventMediator implements ApplicationListener<WhistleEvent> { 
    // TODO: make thread safe 
    final Set<Consumer<WhistleEvent>> consumers; 

    void subscribe(Consumer<WhistleEvent> c) { ... } 

    void unsubscribe(Consumer<WhistleEvent> c) { ... } 

    @Override public void onApplicationEvent(WhistleEvent we) { 
     // delegate to subscribed consumers 
    } 
} 

@Component 
@Scope(WebApplicationContext.SCOPE_REQUEST) 
public class WhateverBean implements Consumer<WhistleEvent> { 
    @Inject 
    WhistleEventMediator mediator; 

    @PostConstruct 
    void init() { 
     mediator.subscribe(this); 
    } 

    @PreDestroy 
    void destroy() { 
     mediator.unsubscribe(this); 
    } 

    // handle whistle event 
} 
+0

मैं तुम्हें यहाँ क्या रूपरेखा के बारे में का सहारा लिया एक 'ConcurrentHashMap' का उपयोग कर:

है यही कारण है, अन्य गुंजाइश उदाहरणों को घटनाओं प्रेषण करने के लिए, आप की तरह उदाहरण के लिए अपने आप को भेजने, कर दिया था और अतिरिक्त मुद्दे के साथ 'उपभोक्ता' एक लैम्ब्डा है और किसी को इसकी पहचान पर भरोसा नहीं करना चाहिए। इसलिए मुझे मानचित्र के लिए एक अद्वितीय कुंजी उत्पन्न करने की आवश्यकता है। यह बदसूरत है, लेकिन अभी के लिए काम करता है। –

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