2011-12-15 14 views
5

अगर मैं एक अनुरोध scoped CDI सेम JMS का उपयोग कर एक @MessageDriven EJB में इंजेक्शन, नीचे के रूप में, मैं यह मान सकते हैं कि किसी भी Foo उदाहरण एक बार में केवल एक एकल onMessage मंगलाचरण द्वारा उपयोग किया जाएगा है ?@MessageDriven सेम में @RequestScoped CDI इंजेक्शन

दूसरे शब्दों में, नीचे दिए गए उदाहरण में, मैं सुरक्षित रूप से सदस्य चर Foo वस्तु में एक JSF @RequestScoped कामयाब सेम को सबरूटीन्स भर में राज्य स्टोर करने के लिए, तुलनात्मक रूप से उपयोग कर सकते हैं?

ध्यान दें कि यह ठीक है अगर एक ही Foo वस्तु अगले करने के लिए एक onMessage कॉल से क्रमिक रूप से पुनर्नवीनीकरण हो जाता है, जब तक प्रत्येक MessageDrivenBean उदाहरण अपने आप ही Foo उदाहरण ऐसा है कि दो अनुरोध प्रसंस्करण समवर्ती पृथक किया जाएगा के रूप में।

@MessageDriven 
public class MessageDrivenBean implements MessageListener { 
    @Inject 
    private Foo foo; 

    public void onMessage(Message m) { 
     foo.doSomething(); 
    } 
} 

@Named 
@RequestScoped 
public class Foo { 
    private String property; 
    public void doSomething() { 
     property = ...; 
    } 
} 

उत्तर

10

अनुरोध स्कोप/संदर्भ में डब्लूआरटी, धारा 6.7.1 में सीडीआई स्पेक का कहना है कि यह संदेश लिस्टर को लागू करने वाले संदेश संचालित बीन के लिए सक्रिय होगा। यह संदेश की डिलीवरी के बाद भी नष्ट हो जाता है, इसलिए आपके पास दिए गए प्रत्येक संदेश के लिए एक नया उदाहरण होगा। इसके अलावा, धारा 6.7.3 बताती है कि आवेदन संदर्भ भी सक्रिय है (जैसा कि कोई उम्मीद करेगा)। वार्तालाप और सत्र स्कोप सक्रिय नहीं हैं।

+0

बहुत बढ़िया। यही वही है जो मैं उम्मीद कर रहा था, और मैंने इंजेक्शन ऑब्जेक्ट पर एक उदाहरण काउंटर डालने की पुष्टि की। (यह पहले ऐसा नहीं कर रहा था और यह निकला कि मैंने सही javax.enterprise के बजाय javax.faces से '@ RequestScoped' एनोटेशन आयात किया है।) – wrschneider

1

मुझे आश्चर्य है कि यह काम करेगा या नहीं। आप एमडीबी के साथ किस प्रकार का प्रोटोकॉल उपयोग करना चाहते हैं?

एमडीबी लगभग हमेशा असीमित रूप से (जैसे जेएमएस के माध्यम से) आते हैं, इसलिए onMessage() कहलाते समय किसी भी सक्रिय अनुरोध की कोई धारणा नहीं है। आम तौर पर एमडीबी को प्रोटोकॉल से मेल खाने वाले इंटरफेस को कार्यान्वित करने की भी आवश्यकता होती है (उदाहरण के लिए जेएमएस के लिए एमडीबी को javax.jms.MessageListener लागू करने की आवश्यकता है)।

+0

हाँ मैं जेएमएस का उपयोग कर रहा हूं। उपरोक्त उदाहरण में स्पष्ट। इस संदर्भ में, "अनुरोध स्कोप" द्वारा, मैं वास्तव में "सिंगलटन नहीं" कहने की कोशिश कर रहा हूं - दूसरे शब्दों में, प्रत्येक एमडीबी उदाहरण में एक नया 'फू' इंजेक्शन दिया जाता है, जैसे कि दो समवर्ती 'ऑन मैसेज' हैंडलर टकराते नहीं हैं। – wrschneider

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