2012-12-24 14 views
5

के अंदर सीडीआई स्टार्टअप को नियंत्रित करना मैं यहां नया हूं और सीडीआई दुनिया में भी नया हूं, और मेरे काम में जो पहला काम मिला वह सीडीआई अपलोडिंग को नियंत्रित करने का एक तरीका ढूंढना था।ईजेबी 3.1

हम EJB 3.1 और CDI 1.0 दोनों का उपयोग कर रहे हैं, और क्योंकि वे विभिन्न कंटेनरों के द्वारा नियंत्रित कर रहे हैं, हम नियंत्रित कर सकते हैं कि कब और क्या में आदेश EJB प्रबंधित बीन्स @Startup और @Singleton एनोटेशन का उपयोग करके ऊपर निर्भर करेगा।

लेकिन @Inject सीडीआई बीन मैंने अपनी कक्षा में घोषित किया है क्योंकि सीडीआई कंटेनर अभी तक शुरू नहीं हुआ है।

मैं समाधान के लिए अब कई दिनों के लिए प्रयास कर रहा हूं और मुझे मिली here काम नहीं किया (अभी भी शून्य के रूप में आया)।

हम जावा ईई 6 का उपयोग कर रहे हैं और WebSphere अनुप्रयोग सर्वर 8.

कृपया पर आवेदन चल रहा है, यदि आप मदद कर सकता है मेरे अंदर और EJB की परवाह किए बिना CDI अपलोड करने को नियंत्रित करने का रास्ता मिल?

public interface BaseStartUp { 
public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException; 
} 

क्वालीफायर और कार्यान्वयन::

@Retention(RetentionPolicy.RUNTIME) 
@Target ({ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) 
@Qualifier 
@Dependent 
public @interface MyStartup { 
} 


@MyStartup 
public class MyStartUpLoader implements BaseStartUp { 

    @Inject 
    SomeConfigLoader config; 

    @Override 
    public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException { 
    conifg.init();  
} 
} 
+0

आप कुछ नमूना कोड तुम कैसे करते जोड़े जा सके –

+0

मैंने कोड नमूने के साथ सवाल संपादित किया है। – user1917984

+0

बस सोच रहा है, लेकिन शेष प्रश्न के साथ क्या करने के लिए 'नियंत्रित अपलोडिंग' है? –

उत्तर

3

हो सकता है कि दोहरी जांच CDI है कि

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

@Singleton 
@Startup 
public class BaseStartupLoader{ 


/** 
* Default constructor. 
*/ 
@Inject @MyStartup 
BaseStartUp myStartup; 

private static Logger m_logger = LoggerFactory.getLogger(BaseStartupLoader.class); 
public BaseStartupLoader() { 

} 

@PostConstruct 
public void init(){ 

    String applicationName = null; 

    try { 

      applicationName = myStartup.getClass().getName(); 
      myStartup.load(); 

    } catch (IllegalAccessException e) { 
     m_logger.error("Faild to load data into preload system. "+e);    
    } catch (InstantiationException e) { 
     m_logger.error("Faild to load data into preload system. "+e);    
    } catch (ClassNotFoundException e) { 
     m_logger.error("Faild to load data into preload system - Class "+ applicationName + "Not found. "+e);    
    } 
    } 
} 

यहाँ BaseStartup इंटरफेस है:

यहां इसके बारे में एक नमूना कोड है वास्तव में आवेदन के सभी स्थानों में सक्षम जहां इसे होना चाहिए। एक प्रयोग के रूप BaseStartupLoader लिए इस कोड को जोड़ने का प्रयास करें: test चर @PostConstruct में अशक्त ऊपर आता है

@Singleton 
@Startup 
public class BaseStartupLoader { 

    @Inject @MyStartup 
    BaseStartUp myStartup; 

    @Inject 
    private InjectionTest test; 


    public static class InjectionTest {} 
} 

, तो CDI जार जहां BaseStartupLoader घोषित किया जाता है में सक्षम नहीं होने की संभावना है।

कहते हैं, उदाहरण के लिए, BaseStartupLoader एक जार orange.jar और MyStartUpLoader बुलाया में घोषित किया जाता है, तो एक जार yellow.jar कहा जाता है, में घोषित किया जाता है तो इन दोनों फ़ाइलों को मौजूद होना चाहिए:

  • orange.jar!/META-INF/beans.xml
  • yellow.jar!/META-INF/beans.xml

यदि META-INF/beans.xml के माध्यम से दोनों जार में सीडीआई ठीक से सक्षम है, तो यह कंटेनर में एक बग है। @PostConstruct से पहले सभी @Inject अंक पूर्ण होने की आवश्यकता है (सीडीआई-सक्षम जार के लिए)। यह सच है कि @Startup का उपयोग किया जाता है और बीन्स में से एक ईजेबी होता है।

+0

स्थैतिक आंतरिक वर्ग इंजेक्शन एक साफ चाल है! इस टिप को साझा करने के लिए धन्यवाद। –

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, मैंने किया है कि आप परीक्षण कर रहे हैं और वास्तव में वेरिएबल @PostConstruct में शून्य के रूप में आया है, और अधिक jars फ़ाइलें मेटा-आईएनएफ/beans.xml में मौजूद हैं, लेकिन असली समस्या है कि ईडीजे कंटेनर पहले से ही चालू होने पर सीडीआई कंटेनर शुरू नहीं हुआ है, मुझे वेब पर एक समाधान मिला - ईजेबी से पहले सीडीआई कंटेनर शुरू करने के लिए स्टार्ट-ऑन-लोड सर्वलेट का उपयोग करने के लिए। लेकिन यह समाधान हमारे लिए अच्छा नहीं है (हम बैकएंड में WAR फ़ाइलों को नहीं देखते हैं। अगर किसी के पास कोई अन्य विचार है तो मैं परेशानियों के लिए खुला हूं ... – user1917984

0

डेल्टास्पाइक पर एक नज़र डालें। एक सीडीआई नियंत्रण मॉड्यूल है जो अब आप जो खोज रहे हैं उसे करना चाहिए। मेरा मानना ​​है कि जावा ईई 7 को भी इसे ठीक करना चाहिए।

+0

आप गलत नहीं हैं, मुझे पता चला कि यह समस्या होगी सीडीआई 1.1 रिलीज में हल किया गया, लेकिन फिर भी मुझे यह देखने के लिए बहुत अच्छा लगा कि कोई सक्रिय समाधान नहीं है (सर्वलेट लोड-ऑन-स्टार्टअप एक को छोड़कर) – user1917984

5

काफी अनुसंधान के बाद मैं, आईबीएम में लोगों से कुछ मदद मिल गया के बाद से हम WebSphere अनुप्रयोग सर्वर के साथ काम कर रहे हैं मैं तो बस जोड़ सकते हैं एक JVM संपत्ति कहा जाता है:

"com.ibm.ws.cdi.immediate। EJB।प्रारंभ करें "= सही

व्यवस्थापक कंसोल में WAS के लिए, और वह यह सुनिश्चित करेगा कि एक बार जब मैं @Startup बीन में ईजेबी @ पोस्टकॉन्स्ट्रक्चर विधि प्राप्त करूंगा, तो मैंने सीडीआई कंटेनर पहले से ही ऊपर और चल रहा होगा और । पहले से ही इंजेक्शन

यह काम करता है !!

यहाँ आईबीएम साइट में समस्या और समाधान के लिए लिंक है:

http://www-01.ibm.com/support/docview.wss?uid=swg1PM62774

+0

नोट करें कि यह क्लासलोडर के साथ कुछ बदलता है जो जेपीए प्रदाता को ग्रहण लिंक से बदलना पड़ता है ओपनजेपीए (वेबस्फेयर 8.5.5.4 के तहत पाया गया) – Pool

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