2012-11-21 20 views
5

मैं एसएसएच गैनीमेड लाइब्रेरी उर्फ ​​ट्रेलियड उर्फ ​​ओरियन का उपयोग कर रहा हूं।जावा गैनीमेड ट्रेलड ओरियन एसएस सत्र टाइमआउट

मैं सत्र के सटीक व्यवहार को समझने की कोशिश कर रहा हूं क्योंकि मुझे लंबे समय तक एक एसएसएच कनेक्शन खोला जाना चाहिए (शायद हमेशा के लिए) और इसे बंद करने के लिए जब मेरा जेवीएम डाउन हो या ऐसा कुछ हो।

तो, मेरी समस्या यह है। मान लिया जाये कि मैं कुछ इस तरह करते हैं:

Connection conn = new Connection(this.hostName, this.port); 
conn.addConnectionMonitor(new ConnectionMonitor() 
{    
    @Override 
    public void connectionLost(Throwable reason) 
    { 
    System.out.println("Connection Lost " reason.getMessage()); 
    } 
}); 
conn.connect(null, 1000, 20000); 
conn.authenticateWithPublicKey(this.user, keyfile, this.password); 
Thread.sleep(30000); //sleep the Thread for 30 seconds 
Session sess = conn.openSession(); 
sess.execCommand("ls"); 
conn.close(); 

और, उन 30 सेकंड जब धागा सो रहा है में, मैं एक नेटवर्क समस्या की नकल के लिए अपने नेटवर्क इंटरफेस डिस्कनेक्ट कर दें।

1) डिस्कनेक्ट घटना connectionMonitor द्वारा रोक नहीं है और कनेक्शन टूट संदेश मुद्रित नहीं है 2) जब

Session sess = conn.openSession(); 

निष्पादित किया जाता है, इस प्रक्रिया को ब्लॉक और कुछ नहीं होता जब तक मैं कनेक्ट नहीं नहीं है नेटवर्क इंटरफ़ेस फिर से। ऐसा इसलिए है क्योंकि, गैनीमेड कोड को देखते हुए, ऐसा लगता है कि डिस्कनेक्शन ईवेंट का पता नहीं चला है क्योंकि सत्र खोला गया है और जब तक यह सफल नहीं होता है तब तक सत्र लॉक होता है।

तो मेरे प्रश्न हैं: 1) क्या यह व्यवहार चाहता था या यह एक बग है? 2) क्या Connection.openSession() विधि के साथ-साथ कनेक्शन.कनेक्ट() विधि में टाइमआउट सेट करने का कोई तरीका है?

अग्रिम धन्यवाद।

उत्तर

2

मुझे लगता है कि समस्या यह है कि आप 30 सेकंड के लिए केबल को अनप्लग करके एसएसएच डिस्कनेक्शन अनुकरण नहीं कर सकते हैं। इस पर एक नज़र डालें: यदि आप टर्मिनल पर एक एसएसएच कनेक्शन खोलते हैं तो केबल को अनप्लग करें, एसएसएच क्लाइंट भी ब्लॉक करेगा, लेकिन केबल फिर से प्लग होने के बाद स्वचालित रूप से फिर से कनेक्ट हो जाएगा। मुझे लगता है कि आपका कोड वही करेगा।

यदि आप कॉन्फ़िगर किए गए समय के लिए क्लाइंट और सर्वर के बीच कोई डेटा नहीं भेजा जाता है, तो सामान्य रूप से डिस्कनेक्ट हो जाता है, यानी निष्क्रियता की अवधि, भले ही केबल प्लग इन है या नहीं। यह अवधि डिफ़ॉल्ट रूप से 30 सेकंड से अधिक होने की संभावना है।

sshd सर्वर पर आप

ClientAliveInterval

TCPKeepAlive

ClientAliveCountMax कॉन्फ़िगर कर सकते हैं

ये मानक तय करेंगे कितनी देर सर्वर से कुछ डेटा की उम्मीद से पहले इंतजार करेंगे ग्राहक, और वह कितनी बार वास्तविक डेटा के बजाय एक साधारण रख-रखाव पैकेट स्वीकार करेगा । ग्राहक पर आप कॉन्फ़िगर कर सकते हैं

ServerAliveInterval

ClientAliveInterval ServerAliveInterval से छोटा होता है तो - सर्वर जीवित-रखें पैकेट अधिक बार ग्राहक उन्हें भेजता से उम्मीद - आप ClientAliveInterval के बाद डिस्कनेक्ट कर दिया जाएगा निष्क्रियता की मात्रा। इसके साथ आप अपने कोड का परीक्षण कर सकते हैं।

ये कॉन्फ़िगरेशन भी आपके एसएसएच कनेक्शन को अनिश्चित काल तक खोलने की कुंजी हैं। यदि आपका सर्वरAliveInterval क्लाइंटअलीवइंटरवाल से छोटा है - क्लाइंट सर्वर की अपेक्षा से अधिक बार जीवित पैकेट भेजेगा - आप कनेक्शन अनिश्चित काल तक खुले रहेंगे।

Have यहाँ http://docs.oseems.com/general/application/ssh/disable-timeout

मुझे लगता है कि सर्वर या क्लाइंट मशीन के एक पुनः आरंभ अभी भी एक वियोग का कारण बन लगता होगा alook। आपके क्लाइंट मशीन पर प्रतिबंध लगाने के मामले में आपको किसी भी तरह से अपना पूरा कोड फिर से चलाने की आवश्यकता होगी, सर्वर मशीन को फिर से चालू करने के मामले में कनेक्शन मॉनीटर किक करेगा और फिर से कनेक्ट हो सकता है।