2012-03-20 18 views
10

उसी जेटी-कंटेनर में चल रहे दो युद्धों के बीच कम विलंबता संचार प्राप्त करने के लिए क्या विकल्प हैं?उसी कंटेनर में युद्धों के बीच संचार प्रक्रिया

मुझे मूल रूप से दूसरे से एक युद्ध में एक सेवा कॉल करने की आवश्यकता है, लेकिन इसे वेब सेवा के रूप में कॉल करने के ऊपरी हिस्से को बर्दाश्त नहीं कर सकता है।

चूंकि वे एक ही जेवीएम में चल रहे हैं, इसलिए मैं आरएमआई/जेएमएस आदि का उपयोग करने से बचने की उम्मीद कर रहा हूं, लेकिन मुझे नहीं पता कि मेरे पास अन्य विकल्प क्या हैं?

मैंने इंटर-सर्वलेट संचार देखा है, लेकिन प्रत्यक्ष विधि आमंत्रण deprecated है जो सही विकल्प प्रतीत नहीं होता है?

मुझे kyronet भी मिला, लेकिन क्या बेहतर समाधान हैं क्योंकि यह एक ही JVM में है?

जो मैं खोज रहा हूं वह कुछ है जो अपाचे कैमल के VM Component (seda वेब-अनुप्रयोगों के बीच) है, लेकिन चूंकि अनुप्रयोगों में से केवल एक ही कैमेल का उपयोग कर रहा है, यह विकल्प नहीं है।

मैं जानता हूँ कि मैं युद्ध के बीच कुछ डीटीओ के साझा करने के लिए हो सकता है, लेकिन एक साझा पुस्तकालय में सेवा खींच का सुझाव नहीं करते कृपया, कि अगर एक विकल्प मैं इस सवाल :)

पूछ नहीं किया जाएगा था संपादित करें:

ईजेबी-कंटेनर एम्बेड करना शायद एक विकल्प नहीं है।

उत्तर

5

जेएनडीआई के साथ इंटरफेस पंजीकृत करें और उन्हें वैश्विक बनाएं ताकि 'अन्य' सर्वलेट उन्हें भंडार से पुनर्प्राप्त कर सके।

चेक this

(ध्यान दें: हम अपने ही रजिस्ट्री कार्यान्वयन के पक्ष में JNDI छोड़ दिया है, लेकिन हम एक ही JVM में प्रोग्राम के रूप में रजिस्ट्री और जेट्टी शुरू)

+0

आपके उत्तर के लिए धन्यवाद! आपने जेटी के जेएनडीआई समर्थन को क्यों छोड़ दिया? तो क्या आपने अपना नामकरण प्रबंधक लागू किया था, लेकिन अभी भी कॉन्टेक्स्ट एपीआई का उपयोग किया है, या आपने जेएनडीआई को एक साथ छोड़ दिया है?क्या आप मुझे कुछ संसाधनों के बारे में बता सकते हैं कि जेटी के साथ समस्याग्रस्त रूप से पंजीकरण कैसे करें? ओह, और अंत में, संदर्भ या क्रमबद्ध द्वारा पारित इस समाधान के माध्यम से स्थानांतरित वस्तुओं हैं? – ebaxt

+0

हम 'संदर्भ' से गुजरते हैं ताकि ऑब्जेक्ट्स इंस्टेंस सीधे पता योग्य हों। जेएनडीआई ठीक है: कुछ जानकारी [लिंक] (http://docs.codehaus.org/display/JETTY/JNDI) के लिए इस लिंक को आजमाएं। हमने इसे छोड़ने का कारण दो गुना था: हम अधिक लचीलापन (निश्चित इंटरफेस, क्वेरी कार्यक्षमता, रनटाइम पंजीकरण के साथ एकाधिक रजिस्ट्रियां) और एक दुबला पैकेज (जेएनडीआई जेनेरिक है और कार्यक्षमता प्रदान करता है जिसकी हमें आवश्यकता नहीं है) चाहिए। आपकी रजिस्ट्री को कार्यान्वित करने के लिए आवश्यक है कि आप वेबपैप लाइफसील को सही तरीके से संभाल लें, जो आसान नहीं हो सकता –

+0

बहुत बढ़िया, बहुत बहुत धन्यवाद! – ebaxt

2

स्थानीय इंटरफेस के साथ ईजेबी के रूप में सेवा का खुलासा करना एक विकल्प होगा। मानक गारंटी नहीं देता है कि इसे लागू होने पर प्रत्यक्ष कॉल के रूप में लागू किया जाएगा, लेकिन apparently most app servers implement it that way। जेटी में चलने के लिए, आपको एक एम्बेडेबल ईजेबी कंटेनर जैसे OpenEJB, JBoss embeddable या Spring's Pitchfork का उपयोग करना होगा।

+0

धन्यवाद! चूंकि हमारे पास एक कस्टम एम्बेडेड-जेट्टी रैपर के आधार पर एक बड़ी एसओए-तैनाती है, इसलिए मुझे कोई बात नहीं है कि एक ईजेबी-कंटेनर मेरे प्रबंधक के साथ उड़ान भरने जा रहा है। – ebaxt

+0

@ebaxt: मुझे संदेह है कि 10 साल पहले लेबल "ईजेबी" और इसकी खराब प्रतिष्ठा पर पूरी तरह से टिका है। यदि कोई अन्य सरल समाधान नहीं बढ़ता है, तो यह कोशिश करने लायक हो सकता है। –

+0

हां, आप शायद दोनों बिंदुओं पर सही हैं;) – ebaxt

1

यह दोनों के बीच "संवाद" के लिए संभव है ServletContext.getContext (स्ट्रिंग यूरीपाथ) और RequestDispatchers (या यहां तक ​​कि ServletContext श्रोताओं) का उपयोग कर सह-स्थित वेब अनुप्रयोग।

सहकर्मी Reynders (http://www.coderanch.com/t/222608/Web-Services/java/communicate-war-files)

के बाद नमूना काम कर कोड है द्वारा सुझाए गए मैंने कोशिश की :)

public void doGet(HttpServletRequest Prequest, HttpServletResponse Presponse) 
    throws IOException, ServletException { 

    ServletContext sc = getServletContext().getContext("/war2"); 
    RequestDispatcher rd = sc.getRequestDispatcher("/LoginHandler?UserId=DummyUser"); 
    rd.forward(Prequest, Presponse); 
} /* End of doGet */ 
संबंधित मुद्दे