2012-01-09 6 views
8

मुझे पता है कि टोमकैट और सर्वलेट spec do not support starting webapps in a particular orderटोमकैट - एक विशिष्ट क्रम में वेबपैप्स शुरू करना

हालांकि, यह मुझे एक आम उपयोग के मामले की तरह लगता है, और मुझे आश्चर्य है कि किसी ने इसके लिए एक चालाक कामकाज की खोज की है।

मेरे पास वेबएप ए है जो एक साझा सेवा का पर्दाफाश करने के लिए स्प्रिंग रीमोटिंग का उपयोग करता है, जिसमें से वेबपैप बी एक ग्राहक है। वेबएप बी प्रारंभ नहीं हो सकता है जब तक कि वेबएप ए चल रहा न हो। हालांकि, मेरा टोमकैट हमेशा वेबपैप्स बी से शुरू होता है, वेबपैप बी

बुनियादी ढांचे के कारणों से मुझे इन्हें एक ही टोमकैट सर्वर पर चलाना होगा।

कोई विचार?

धन्यवाद, रॉय

अद्यतन -

बाहर कर देता है कि मेरे विशेष मामले में, आदेश फर्क नहीं पड़ता। इसका कारण यह है: कहें कि मैं ऐप बी से पहले एप ए शुरू करने के लिए नीचे दिए गए तरीकों में से एक का उपयोग करता हूं। इसलिए ऐप ए शुरू होता है, लेकिन, चूंकि स्प्रिंग रिमोटिंग HTTP Invoker का उपयोग कर रहा है, इसलिए HTTP पोर्ट अभी तक खुला नहीं है (यह नहीं खुल जाएगा तक सभी ऐप्स प्रारंभ हो गए हैं)। तो ए शुरू होगा, और बी लटकाएगा, क्योंकि जिस पोर्ट को वह ढूंढ रहा है वह अभी तक उपलब्ध नहीं है। रवींद्र।

अंतिम परिणाम दो अलग टोमकैट उदाहरण थे।

+0

वह वेब ऐप है जिसे विफल करने और छोड़ने के बजाए अन्य वेब ऐप की प्रतीक्षा करने की आवश्यकता है। –

+1

अरे डेव, unf। वे समानांतर में शुरू नहीं होते हैं .. बी शुरू होता है (ठीक है, शुरू करने का प्रयास करता है) और फिर ए शुरू हो जाएगा। लेकिन अगर बी शुरू नहीं हो सकता है क्योंकि यह ए से कनेक्ट नहीं हो सकता है, ए कभी शुरू करने की कोशिश नहीं करता है। –

+1

इसे एएससीआईआई आदेश में शुरू करना चाहिए। डेबियन अपाचे इंस्टॉलेशन पर एक चाल जो मैं देखता हूं वह 000_default, 001_default नामकरण सम्मेलन बनाना है। डीआईआर लिस्टिंग के ASCII आदेश को देखते समय यह थोड़ा स्पष्ट हो जाता है। – speeves

उत्तर

3

हमें एक ही समस्या है और इसे हल करने के लिए हम इस तथ्य पर निर्भर हैं (फिसलन, मुझे पता है) कि <tomcat_home>/conf/server.xml में परिभाषित किए गए क्रम में एप्लिकेशन शुरू हो गए हैं।

यह निश्चित रूप से server.xml में हार्डकोडिंग ऐप्स का नुकसान है लेकिन हम इसके साथ रह सकते हैं।

+0

धन्यवाद दिमाग - यह संभवतः यह करने का सबसे अच्छा तरीका है लेकिन असफल मेरे लिए काम नहीं करता है - मैं अपने प्रश्न को संपादित करने के लिए क्यों संपादित करूंगा। –

1

सिद्धांत रूप में आप contextInitialized() जो बारी में निश्चित अंतराल पर अन्य webapp की उपलब्धता की जांच करता है में ExecutorService द्वारा एक Runnable अंडे कर सके (शायद एक HTTP HEAD अनुरोध फायरिंग से?)। एक बार जब अन्य वेबपैप उपलब्ध हो जाए, तो सर्वलेट संदर्भ में कुछ विशेषता सेट करें जो इंगित करता है। Filter जोड़ें जो उस विशेषता की उपस्थिति और ब्लॉक/तदनुसार अनुरोध जारी रखता है।

0

यहां एक अच्छी चाल है जिसका उपयोग मैं वेबपैड लोडिंग के 2 स्तर बनाने के लिए करता हूं। प्रत्येक स्तर में आदेश की गारंटी नहीं है। यह इस तथ्य पर निर्भर करता है कि टोमकैट पहले संदर्भ वर्णनकर्ताओं को टोमकैट/conf/[इंजन नाम]/[होस्ट नाम] से लोड करेगा और केवल सर्वर.xml

में होस्ट तत्व के ऐपबेस विशेषता से संदर्भों को संदर्भित करेगा। webapp में कहीं कोड आप चाहते हैं 2 स्तर में लोड करने के लिए (यानी बाद में)

File contextDescriptor = new File(getParameter("catalina.home"),"/conf/Catalina/localhost/mywebapp.xml"); 
contextDescriptor.deleteOnExit(); 
3

प्राप्त करने के लिए अगर आप बिल्ला कोड का एक सा हैकिंग और अपने खुद के होस्ट उदाहरण बनाकर परवाह नहीं है काफी आसान है कि

1) org.apache.catalina.core का उप-वर्ग बनाएं।StandardHost, कहते हैं कि myhost:

class MyHost extends org.apache.catalina.core.StandardHost{ 
     public MyHost(){ 
     super(); 
     //changing HashMap for a predictable ordered Map :) 
     this.children = new LinkedHashMap(); 
     } 
    } 

2) जब तक आप अपने सभी वेब एप्लिकेशन में घोषित किया है कि आपके सर्वर के एक्सएमएल होस्ट टैग()

के रूप में यह लग सकता है अतुल्य है, यह समस्या का हल पर अपनी कक्षा रजिस्टर होस्ट टैग के अंदर सही क्रम:

<Host> 
    <context app1> 
    <context app2> 
    </Host> 

Thaen APP1, कोई फर्क नहीं पड़ता जो अतः आप इस्तेमाल किया APP2 से पहले शुरू कर देंगे।

+1

पहले चरण के बाद, हमें माईहोस्ट क्लास कहां रखना चाहिए? क्या आप कृपया और विस्तार से बता सकते हैं। – abi1964

+0

क्या हमारे पास होस्ट कॉन्फ़िगरेशन का उदाहरण हो सकता है –

1

मैं जानता हूँ कि इस सवाल का एक सा पुराना है, लेकिन जब एक ही बात करने का प्रयास कर मुझे मिल गया और सोचा था कि मैं एक बेहतर समाधान के साथ अद्यतन हूँ ...

आप अपने सर्वर में एकाधिक सेवाओं को परिभाषित कर सकते हैं। एक्सएमएल, जो विभिन्न बंदरगाहों पर चलती है। सेवाओं को क्रमशः सर्वर.एक्सएमएल में दिखाई देने के क्रम के अनुसार शुरू किया जाता है। इसका मतलब है कि - हो सकता है - उदाहरण के लिए - पहली सेवा में चल रही एक कॉन्फ़िगरेशन सेवा और उसके बाद उस पर निर्भर होने वाले ऐप्स (मैं उन सभी के लिए डिफ़ॉल्ट कैटालिना का उपयोग करता हूं ...)

आप अधिक जानकारी देख सकते हैं: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27

और से पहले कैटालिना सेवा इस सेवा है कि मैं शामिल है:

<Service name="ConfigService"> 
    <Connector port="8081" protocol="HTTP/1.1" 
     connectionTimeout="20000" 
     redirectPort="8444" /> 
    <Engine name="ConfigServiceEngine" defaultHost="localhost"> 
     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true" 
      xmlValidation="false" xmlNamespaceAware="false"> 

      <Context path="/" reloadable="true" docBase="/path/to/your/service/directory" /> 
     </Host> 
    </Engine> 
</Service> 

आप देख सकते हैं, मैं docbase बल्कि appBase से उपयोग करें, लेकिन आप होना चाहिए यदि आप प्रीफ़ेस करते हैं तो एक अलग ऐपबेस कॉन्फ़िगर करें आर ...

एनबी सेवा और इंजन दोनों का नाम बदलना महत्वपूर्ण है।

HTH

1

यहाँ लिनक्स पर एक और चाल है।

त्रुटिपूर्ण डब्लूएसडीएल की वजह से हमारे कुछ webservice अनुप्रयोग तैनात करने में विफल रहते हैं। ऐसा तब होता है जब वे कई अन्य अनुप्रयोगों के बाद तैनात या शुरू हो जाते हैं। वे किस क्रम में शुरू कर रहे हैं जिस क्रम में संदर्भ एक्सएमएल के/opt/अपाचे-tomee/conf में पाए जाते हैं पर निर्भर करता है/कैटालिना/स्थानीय होस्ट

"ls -1f" का उपयोग कर सत्यापित किया जा सकता है। एक सादा "एलएस" एक क्रमबद्ध आउटपुट देता है।

यह उस क्रम में उपयोग किया जाता था जिसमें फाइलें उस निर्देशिका में जोड़ दी गई थीं, लेकिन ext4 फाइल सिस्टम के साथ, आदेश फ़ाइल नाम के हैश पर आधारित है।

# tune2fs -O ^dir_index /dev/xyz 

अब आप कम से कम अपने आप को किस क्रम में वे शुरू हो जाएगा तय कर सकते हैं: इस प्रकार यह निष्क्रिय किया जा सकता। पुन: क्रमबद्ध करें: सभी फ़ाइलों को एक अस्थायी फ़ोल्डर में ले जाएं, उन्हें वांछित अनुक्रम में वापस ले जाएं।

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