2008-10-09 8 views
10

के लिए पुनः कनेक्ट करें हमारे पास एक TIBCO ईएमएस समाधान है जो 2-4 सर्वर वातावरण में अंतर्निहित सर्वर विफलता का उपयोग करता है। यदि टीआईबीसीओ एक ईएमएस सर्वर से दूसरी सेवाओं में असफल सेवाओं को प्रशासित करता है, तो कनेक्शन को ईएमएस सेवा स्तर पर स्वचालित रूप से नए सर्वर में स्थानांतरित किया जाना चाहिए। ईएमएस सेवा का उपयोग कर हमारे सी # अनुप्रयोगों के लिए, यह नहीं हो रहा है - हमारे उपयोगकर्ता कनेक्शन विफलता के बाद नए सर्वर में स्थानांतरित नहीं किए जा रहे हैं और हमें यकीन नहीं है कि क्यों।टीआईबीसीओ ईएमएस विफलता सी # (TIBCO.EMS.dll)

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

मैं एक स्वचालित दृष्टिकोण की तलाश में हूं जो समय-समय पर ईएमएस से फिर से कनेक्ट करने का प्रयास करेगा यदि यह पता चलता है कि कनेक्शन मर चुका है लेकिन मुझे यकीन नहीं है कि यह कैसे करना है।

कोई विचार? हम TIBCO.EMS.dll संस्करण 4.4.2 और .Net 2.x (SmartClient ऐप)

किसी भी मदद की सराहना की जाएगी।

+0

कैसे आप वर्तमान में दोष सहिष्णुता को लागू कर रहे हैं? 'Factories.conf' फ़ाइल में सर्वर पर? क्या आपकी 'url' प्रॉपर्टी में पृष्ठ 134 पर 'tib_ems_dotnet_ref.pdf' में उल्लिखित URL की अल्पविराम से अलग सूची शामिल है? –

+0

हां, और वह, विश्वास करो या समस्या नहीं है। जब ईएमएस सर्वर विफल हो जाता है तो कनेक्शन को एक सर्वर से दूसरे सर्वर में स्थानांतरित किया जाना चाहिए। यह तब काम करना चाहिए जब आपके कनेक्शन स्ट्रिंग में ईएमएस सर्वर की सीमांकित सूची हो लेकिन मुझे लगता है कि EMS.lib में कोई बग है, यह काम नहीं कर रहा है – ScottCher

+0

श्रोताओं द्वारा विफलता के बाद एक त्रुटि फेंक दी गई है? क्या उत्पादकों द्वारा विफलता के बाद फेंक दिया गया त्रुटि है (संदेश भेजते समय)? सबसे अधिक संभावना है कि लाइब्रेरी आपको पुनः कनेक्ट करने की अपेक्षा करती है। कनेक्शन स्ट्रिंग में एकाधिक सर्वर प्रदान करने से कनेक्ट होने के दौरान इसे रॉबिन के चारों ओर गोल करने देता है - बाद में नहीं ... – TheSoftwareJedi

उत्तर

6

इस पोस्ट में मेरे वर्तमान टिप्पणियों योग और अधिक विस्तार में मेरी दृष्टिकोण की व्याख्या करनी चाहिए ...

TIBCO 'ConnectionFactory' और 'कनेक्शन' प्रकार, दिग्गज हैं धागा सुरक्षित प्रकार के। टीआईबीसीओ सुझाव देता है कि आप एक कनेक्शन फैक्टरी (प्रति सर्वर कॉन्फ़िगर किए गए फैक्ट्री) और एक प्रति कारखाना कनेक्शन का उपयोग बनाए रखें।

सर्वर दिखाई देता है ताकि 'कनेक्शन' विफलता और पुनः कनेक्शन के लिए ज़िम्मेदार हो, तो आइए पुष्टि करें कि यह अपना काम कर रहा है और फिर उस सुविधा पर निर्भर है।

क्लाइंट साइड समाधान बनाना सर्वर या क्लाइंट सेटअप समस्या को ठीक करने से थोड़ा अधिक शामिल होने जा रहा है। असफल कनेक्शन से आपके द्वारा बनाए गए सभी सत्रों को फिर से बनाया जाना चाहिए (उत्पादकों, उपभोक्ताओं और गंतव्यों का उल्लेख न करें)। किसी भी प्रकार पर "रीकनेक्ट" या "रीफ्रेश" विधियां नहीं हैं। सत्र या तो उनके मूल कनेक्शन का संदर्भ बनाए रखते हैं।

आपको कनेक्शन/सत्र ऑब्जेक्ट्स का लुकअप प्रबंधित करना होगा और नट्स को फिर से शुरू करना होगा! या कुछ प्रकार के सत्र विफलता ईवेंट हैंडलर को कार्यान्वित करें जो नया कनेक्शन प्राप्त कर सकता है और उन्हें पुनः कनेक्ट कर सकता है।

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

+1

मैंने Tibems.SetExceptionOnFTSwitch (सत्य) स्थापित किया है, इसलिए अब जब हम कनेक्शन विफल हो जाते हैं तो मैं देख रहा हूं। हम अभी तक एक विफलता सेटिंग में परीक्षण करने में सक्षम नहीं हैं लेकिन कनेक्शन समाप्त होने पर मुझे अपवाद मिल रहे हैं। जब सर्वर वापस आता है तो अंतर्निहित पुन: कनेक्ट नहीं हो रहा है। – ScottCher

+0

हमने सर्वर-क्लाइंट और क्लाइंट-सर्वर दिल की धड़कन की जांच की है। वे परीक्षण पर्यावरण में अक्षम थे और मैंने सोचा कि काम नहीं कर रहे दोबारा जुड़ने का कारण हो सकता है। सक्षम, 10s पर सेट करें और हम अभी भी पुनः कनेक्ट प्रयास नहीं करते हैं। – ScottCher

+0

तथ्य यह है कि मैं सर्वर कनेक्शन विफलता के लिए जाल कर सकता हूं यह एक अच्छा संकेत है, लेकिन मैं ईएमएस लाइब्रेरी से रीकनेक्ट लॉजिक को लूप रीकनेक्ट करने की बजाय मैन्युअल रूप से प्रयास करना चाहता हूं। – ScottCher

1

क्लाइंट एप्लिकेशन tibco.tibjms.ft.switch.exception प्रणाली संपत्ति

शायद पुस्तकालय की जरूरत है कि काम करने के लिए स्थापना करके एक विफलता की सूचना प्राप्त कर सकते हैं?

8

सबसे पहले, हाँ, मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि बिना किसी अजीब के, मैं कहीं भी नहीं रहूंगा। आपको बहुत - बहुत धन्यवाद!

एक: कनेक्शन फैक्टरी। SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout उचित रूप से सेट किया जाना चाहिए। मुझे लगता है कि डिफ़ॉल्ट मान बहुत जल्दी पुनः प्रयास करें (पुनः प्रयासों के बीच 1/2 सेकंड के क्रम में)।हमारे ईएमएस सर्वर नेटवर्क स्टोरेज इत्यादि के कारण फेलओवर के लिए काफी समय ले सकते हैं - इसलिए 1/2 एस अंतराल पर 5 रिट्री काफी लंबे समय तक कहीं भी नहीं हैं।

TWO: मुझे विश्वास है कि क्लाइंट-सर्वर और सर्वर-क्लाइंट दिल की धड़कन को सक्षम करने के लिए यह महत्वपूर्ण है। सत्यापित करने में सक्षम नहीं था लेकिन उन जगहों के बिना, क्लाइंट को अधिसूचना नहीं मिल सकती है कि सर्वर ऑफ़लाइन है या फ़ेलओवर मोड में स्विच कर रहा है। यह, निश्चित रूप से, ईएमएस के लिए एक सर्वर पक्ष सेटिंग है।

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

चार: ईएमएस दस्तावेज में स्पष्ट रूप से स्पष्ट नहीं है, कनेक्शन रीकनेक्ट एकल सर्वर वातावरण में काम नहीं करेगा। आपको एक बहु-सर्वर, गलती सहनशील वातावरण में होना चाहिए। हालांकि, एक चाल है। आप एक ही सर्वर को दो बार कनेक्शन सूची में डाल सकते हैं - अजीब मुझे पता है, लेकिन यह काम करता है और यह अंतर्निहित रीकनेक्ट तर्क को काम करने में सक्षम बनाता है।

कुछ कोड:

private void initEMS() 
{ 
    Tibems.SetExceptionOnFTSwitch(true); 
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>); 
    _ConnectionFactory.SetReconnAttemptCount(30);  // 30retries 
    _ConnectionFactory.SetReconnAttemptDelay(120000); // 2minutes 
    _ConnectionFactory.SetReconnAttemptTimeout(2000); // 2seconds 
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>); 
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler); 
} 
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args) 
{ 
    EMSException e = args.Exception; 
    // args.Exception = "Connection has been terminated" -- single server failure 
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server 
    MessageBox.Show(e.ToString()); 
} 
संबंधित मुद्दे