2013-07-16 12 views
5

बताएं कि डेटाटाक्स जावा कैसंड्रा ड्राइवर को समय-समय पर आप अपने क्लस्टर से कनेक्ट करने का प्रयास करते समय कैसे बताते हैं?डेटास्टैक्स जावा कैसंड्रा ड्राइवर को टाइमआउट क्लस्टर कनेक्शन

मेजबान पहुंचने योग्य होने पर मुझे विशेष रूप से दिलचस्पी है, लेकिन कैसंद्रा बंदरगाहों को अवरुद्ध कर दिया गया है या कैसंद्रा डिमन्स नहीं चल रहे हैं। मैं एक कमांड लाइन क्लाइंट लिख रहा हूं जिसे उचित समय में कनेक्ट नहीं होने पर उपयुक्त त्रुटि संदेश से बाहर निकलना और रिपोर्ट करना चाहिए। वर्तमान में ऐसा लगता है कि यदि संपर्क बिंदु पहुंच योग्य है, तो ड्राइवर प्रतिक्रिया के लिए हमेशा के लिए प्रतीक्षा करेगा।

यही है, मैं Cluster.build()NoHostAvailableException फेंकने के लिए चाहता हूं यदि ड्राइवर किसी दिए गए अधिकतम समय के भीतर किसी भी संपर्क बिंदु के कैसंड्रा डिमन के साथ संवाद नहीं कर सकता है।

  • मेरे अपने RetryPolicy काम नहीं करेगा बनाना: कि पुन: प्रयास प्रश्नों के लिए है, और मैं टाइमआउट लागू करने के लिए इससे पहले कि हम प्रश्नों को चलाने के लिए तैयार कर रहे हैं चाहते हैं।
  • बनाना मेरे अपने ReconnectinoPolicy शुरू में आशाजनक देखा, लेकिन इंटरफ़ेस के लिए अनुबंध का संकेत

उत्तर

7

है यही कारण है, मैं चाहता हूँ Cluster.build "हमेशा के लिए और अधिक मृत होने का इस नोड पर विचार के लिए" किसी भी तरह देता है() NoHostAvailableException को फेंकने के लिए यदि ड्राइवर किसी दिए गए अधिकतम समय के भीतर किसी भी संपर्क बिंदु के कैसंद्रा डिमन के साथ संवाद नहीं कर सकता है।

यह मामला माना जाता है। चालक प्रत्येक संपर्क बिंदु से कनेक्ट करने का प्रयास करेगा और अगर किसी से कनेक्ट करने में विफल रहता है तो अपवाद फेंक देगा। आप अधिकतम समय को नियंत्रित कर सकते हैं जब ड्राइवर सॉकेटऑप्शन .सेटकनेक्टटाइमआउटमिलिस() (डिफ़ॉल्ट 5 सेकंड है) के माध्यम से कनेक्ट करने का प्रयास करेगा (प्रत्येक नोड में)।

मेरा अनुभव यह है कि क्लस्टर.बिल्ड() कोई अपवाद वापस नहीं करता है अगर कोई नोड कनेक्ट नहीं किया जा सकता है, लेकिन यदि आपका अनुभव अलग है, तो आप इसे एक बग के रूप में रिपोर्ट करना चाहेंगे (लेकिन आप पुन: पेश करने के बारे में थोड़ा और विस्तार यह मदद करेगा)।

यही कहा जा रहा है:

  • ऊपर टाइमआउट मेजबान प्रति है। इसलिए यदि आप 100 संपर्क बिंदुओं की एक सूची पास करते हैं, तो आप सिद्धांत में NoHostAvailableException प्राप्त करने से पहले 500 सेकंड (डिफ़ॉल्ट रूप से) प्रतीक्षा कर सकते हैं। लेकिन कई संपर्क बिंदु प्रदान करने में कोई वास्तविक बात नहीं है, और व्यावहारिक रूप से, अगर नोड पर कैसंड्रा नहीं चल रहा है, तो कनेक्शन का प्रयास आमतौर पर विफल हो जाएगा (आप टाइमआउट का इंतजार नहीं करेंगे)।
  • वर्तमान में ड्राइवर पक्ष पर कोई वास्तविक क्वेरी टाइमआउट नहीं है। जिसका अर्थ यह है कि यदि ड्राइवर नोड से कनेक्ट होता है (जिसका अर्थ है कि कुछ प्रक्रिया उस बंदरगाह पर सुन रही है और कनेक्शन स्वीकार कर रही है), लेकिन अपने प्रारंभिक संदेशों का कोई जवाब न दें, तो यह वास्तव में हमेशा के लिए पकड़ सकता है। यह शायद तय किया जाना चाहिए, और मैं आपको https://datastax-oss.atlassian.net/browse/JAVA पर टिकट खोलने के लिए प्रोत्साहित करता हूं। हालांकि, यह ऐसा मामला प्रतीत नहीं होता है जिसका आप वर्णन कर रहे हैं, क्योंकि यदि "कैसंद्रा बंदरगाह अवरुद्ध हैं या कैसंद्रा डिमॉन नहीं चल रहे हैं" तो चालक को पहले स्थान से कनेक्ट नहीं होना चाहिए।
+0

यह संभव है कि मैं वास्तव में दूसरा मामला देख रहा हूं। मुझे उस सॉकेट विकल्प को याद करना होगा। जैसा कि आप इंगित करते हैं, यह ज्यादातर मामलों के लिए पर्याप्त होना चाहिए। – Raedwald

+0

@ रेडवाल्ड, क्या आपने इस मुद्दे के लिए एक बग दर्ज की है, या क्या कोई आसान समाधान था? –

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