2012-05-29 10 views
8

blueprint.xml में, मैं एक वैकल्पिक निर्भरता इस तरह की घोषणा:खाका: एक वैकल्पिक निर्भरता संतुष्ट है अगर मैं कैसे की जाँच करते हैं?

<reference id="RepositoryListener" 
    interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener" 
    availability="optional" /> 

<bean id="Repository" 
    class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl"> 
    <jpa:context property="entityManager" unitname="ODP_Server" /> 
    <tx:transaction method="*" value="Required" /> 
    <property name="repositoryListener" ref="RepositoryListener" /> 
</bean> 

और RepositoryImpl में, मैं

public void setRepositoryListener(RepositoryListener repositoryListener) { 
    logger.info("Repository listener set"); 
    this.repositoryListener = repositoryListener; 
} 

है इस विधि खाका द्वारा कहा जाता है, तब भी जब कोई RepositoryListener सेवा उपलब्ध है के रूप में उम्मीद । समस्या मैं कैसे बाद में जांच कर सकते हैं कि क्या वहाँ एक सेवा है, है?

if (repositoryListener != null) { 
     repositoryListener.notifyDelete(node); 
    } else { 
     logger.warn("No repository listener set!"); 
    } 

काम नहीं करता है, के बाद से repositoryListenernull नहीं है, लेकिन एक खाका प्रॉक्सी।

+1

मेरे हिस्से पर सीमित ज्ञान, लेकिन कुछ संदर्भ है जिसे <संदर्भ-श्रोता> कहा जाता है जिसे के लिए निर्दिष्ट किया जा सकता है और शायद आपके 'रिपोजिटरी' बीन से जोड़ा जा सकता है। –

उत्तर

14

तीन विकल्प हैं।

  • आम तौर पर, अगर कोशिश करते हैं और (लापता) वैकल्पिक सेवा का उपयोग, आप पांच मिनट देरी जबकि खाका प्रकट करने के लिए एक समर्थन सेवा, एक ServiceUnavailableException द्वारा पीछा के लिए इंतजार कर रहा है मिल जाएगा। तो एक विकल्प बहुत छोटा ब्लूप्रिंट टाइमआउट सेट करना है, और ServiceUnavailableException को पकड़ना है।
  • एक यकीनन क्लीनर विकल्प के लिए एक संदर्भ श्रोता उपयोग करने के लिए सेवा के जीवन चक्र की निगरानी के लिए है। इसके अतिरिक्त कोड की आवश्यकता का नुकसान है।
  • सबसे सरल - और इसलिए सबसे अजीब - विकल्प वैकल्पिक संदर्भ के बजाय वैकल्पिक संदर्भ सूची का उपयोग करना है। यदि कोई संतोषजनक सेवाएं मौजूद नहीं हैं, तो सूची खाली होगी। बेशक, आपको यह समझना होगा कि आप क्या करना चाहते हैं यदि एकाधिक संतोषजनक सेवाएं मौजूद हैं। एक (वहाँ

    <reference 
        id="someReference" 
        interface="org.some.service.ServiceInterface" 
        availability="optional" 
        timeout="100" /> 
    

    एक संदर्भ श्रोता का उपयोग करने के लिए, आप अपने खाका एक्सएमएल के लिए निम्न की तरह कुछ जोड़ेंगे:

संक्षिप्त टाइमआउट सेट करने के लिए, बस अपने वैकल्पिक सेवा संदर्भ के लिए एक विशेषता जोड़ें अधिक विस्तृत उदाहरण और Enterprise OSGi in Action के 6 अध्याय में चर्चा):

<reference 
     id="someReference" 
     interface="org.some.service.ServiceInterface"> 
     <reference-listener 
      ref="someBean" 
      bind-method="bind" 
      unbind-method="unbind" /> 
    </reference> 

bind और unbind तरीकों या आपकी सेवा प्रकट होता है और गायब होने के रूप में कहा जाता है (क्योंकि यदि आप संदर्भ सूची का उपयोग कर रहे हैं, तो सेवाओं को आपकी संदर्भ सूची में जोड़ा और हटा दिया गया है)।

संदर्भ सूची का उपयोग करने के लिए वास्तव में कोड उदाहरण की आवश्यकता नहीं है - बस <reference-list तत्व का उपयोग करें और सुनिश्चित करें कि आपकी सेटर विधि एक सूची लेती है।

+0

हां, मैंने तीसरे संस्करण के बारे में भी सोचा है। शायद मेरे लिए सबसे अच्छा विकल्प। –

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