2010-01-15 6 views
5

मैंने कुछ नई जेबॉस टाइम सेवा लिखना शुरू कर दिया है जिसका मतलब कुछ मौजूदा सीम घटकों का उपयोग करना था। लेकिन ऐसा लगता है कि मैं गैर-मौजूदा संदर्भों के कारण इन घटकों तक नहीं पहुंच सकता। क्या जेएसएफ के साथ सामान्य स्थिति के अलावा उन्हें उपयोग करना संभव है?क्या जेबॉस समय सेवा में सीम का उपयोग करना संभव है?

प्रदर्शित करने के लिए मुझे क्या करना चाहते हैं एक छोटी सी टुकड़ा ...

@Service 
public class MyService extends DefaultTimedService implements TimedObject, DefaultServiceInterface { 
    @Timeout 
    public void ejbTimeout(Timer timer) { 
     MyInterface loader = (MyInterface) Component.getInstance(MyInterface.SEAM_NAME, true); 
     // throws no context! 
    } 
} 

कि उदाहरण के लिए निम्नलिखित अपवाद फेंकता है:

java.lang.IllegalStateException: No application context active 
    at org.jboss.seam.Component.forName(Component.java:1945) 
    at org.jboss.seam.Component.getInstance(Component.java:2005) 

उत्तर

8

एक ही रास्ता है कि एक छोटे से गंदा है और वहाँ कई डेवलपर्स कि इस तरह के एक हैक कभी प्रयोग नहीं करेंगे, लेकिन यह आपकी समस्या का समाधान होगा नहीं है काम करने वाले कुछ भी नहीं मिला। अगर किसी के पास कोई दूसरा समाधान है तो मैं इसे यहां देख रहा हूं :)।

+0

धन्यवाद भी ... मैं इसे आज़मा दूंगा ... गंदे लग रहा है लेकिन प्रमोशन :) –

+0

StartCall() मूल बातें ... अच्छी तरह से। अब मुझे अपने घटकों को काम करने के लिए कुछ अन्य पूर्व-स्थितियों को हल करना होगा। धन्यवाद! –

+3

यहां एक और संकेत ... startCall() एक लेनदेन शुरू नहीं करता है और सभी EntityManager संचालन चुपचाप विफल हो जाते हैं। यदि startCall() und endCall() का उपयोग करना लेनदेन को संभालना अनिवार्य है! Transaction.instance() का उपयोग करके() शुरू करें() और Transaction.instance()। प्रतिबद्ध() मैं इसे वास्तव में कुछ वास्तविक करने के लिए प्राप्त कर सकता हूं। –

1

क्या गुंजाइश आप घटक के लिए परिभाषित किया है? शायद अनुप्रयोग संदर्भ के रूप में यह त्रुटि में ऐसा कहता है।

...

तो मैं स्रोत के आसपास poked और पता चला कि संदर्भों Contexts नाम के एक वर्ग में जमा हो जाती है। सभी संदर्भ थ्रेड विशिष्ट प्रतीत होते हैं, क्योंकि वे ThreadLocal-instances में encapsulated हैं। इसका मतलब है कि समय की सेवा के धागे के लिए निर्दिष्ट करना है ...

प्रश्न तब भी बनी हुई है: एक विशिष्ट धागे के लिए संदर्भ कैसे बनाएं।

+0

जिसे मैं उपयोग करना चाहता हूं उसे सत्र स्कोप परिभाषित किया गया है ... अगर यह मदद करता है तो मैं कनवर्सेशन पर स्विच कर सकता हूं। –

1

क्या आप उस स्थिर कॉल के साथ इसे ढूंढने के बजाय loader उदाहरण इंजेक्ट नहीं कर सकते? मैं (वर्ग शरीर में) काफी सीवन से परिचित, लेकिन शायद नहीं कर रहा हूँ:

@In private MyInterface loader; 

और फिर, अपनी विधि में, बस loader का उपयोग करें।

ऐसा लगता है के रूप में, सीवन आवेदन/statelesss स्कोप है, जो अपने मामले में उचित एक लगता है:

@Scope(ScopeType.APPLICATION) 

या

@Scope(ScopeType.STATELESS) 

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

तो ऊपर कार्यक्षेत्रों में से एक में MyService और MyInterface को परिभाषित है, और दोनों इंजेक्शन और अपने देखने विधि का प्रयास करें। संदर्भों और संगामिति पर

चेक Seam tutorial

This thread उपयोगी लगता है।

And from this thread ऐसा लगता है कि @Asynchronous एनोटेशन है, जिसका आप उपयोग कर सकते हैं।

import org.jboss.seam.contexts.Lifecycle; 

@Service 
public class MyService extends DefaultTimedService implements TimedObject, DefaultServiceInterface { 
    @Timeout 
    public void ejbTimeout(Timer timer) { 
     Lifecycle.beginCall(); 

     MyInterface loader = (MyInterface) Component.getInstance(MyInterface.SEAM_NAME, true); 
     // will not throw no context! 
     // also the Component.getInstance(MyInterface.SEAM_NAME, true,true); call 
     // is another way you could inject that component. 

     Lifecycle.endCall(); 
    } 
} 

मैं एक परियोजना में इसका इस्तेमाल किया, जहां मैं नहीं कर सके:

+0

नहीं, मैं नहीं कर सकता।इंजेक्शन में वही समस्या है जैसा ऊपर वर्णित घटक तक पहुंचने का प्रयास करने के साथ है ... संदर्भ गुम है। इंजेक्शन केवल विशिष्ट प्रकारों में काम करता है और आमतौर पर अनुरोध/प्रतिक्रिया जीवन चक्र के दौरान किया जाता है। –

+0

इंजेक्शन स्कोप के आधार पर काम करता है। अनुरोध/प्रतिक्रिया जीवन चक्र अभिसरण/सत्र/अनुरोध स्कोप के बारे में है। कुछ भी हैं। – Bozho

+0

लेकिन जेबॉस सेवा इंजेक्शन निरीक्षकों द्वारा छुआ नहीं है ... यह सर्वर स्टार्टअप के दौरान शुरू होता है। क्या यह हल करना संभव है? - आह ... बस आपके संपादन को पहचाना गया ... इसे आज़माएगा। –