HTTP सत्र और CometD सत्र अलग lifecycles है: उदाहरण के लिए, अगर वहाँ एक अस्थायी कनेक्शन विफलता है, CometD सत्र असफल हो जायेगी, और सर्वर फिर से हाथ मिलाना करने के लिए ग्राहक के लिए पूछना होगा, इस प्रकार एक अलग CometD बनाने सत्र (एक ही उपयोगकर्ता का प्रतिनिधित्व करता है, लेकिन एक अलग धूमकेतु clientId
के साथ)। उसी स्थिति में, HttpSession
वही रहेगा।
इसे ध्यान में रखते हुए, आपको एप्लिकेशन स्तर पर - उपयोगकर्ता नाम के बीच मैपिंग, संवाददाता HttpSession
, और संवाददाता ServerSession
को बनाए रखने की आवश्यकता है। चलिए इस मैपिंग को HttpCometDMapper
पर कॉल करें। हर बार एक नया उपयोगकर्ता में लॉग करता है, आप इसका नाम (या उपयोगकर्ता का एक और अद्वितीय पहचानकर्ता), HttpSession
रजिस्टर, और वर्तमान ServerSession
। शायद आप एक द्विस्तरीय प्रक्रिया है, जहां आप पहले उपयोगकर्ता नाम और HttpSession
, और फिर ServerSession
साथ ही उपयोगकर्ता नाम लिंक की आवश्यकता होगी।
तो एक CometD फिर से हाथ मिलाना किया जाता है, तो आप नए ServerSession
साथ नक्शाकार अद्यतन करें।
आप इतनी है कि जब इसे नष्ट कर दिया है, तो आप नक्शाकार से वर्तमान CometD ServerSession
निकालते हैं और उस पर ServerSession.disconnect()
फोन HttpSession
के लिए एक HttpSessionListener
पंजीकरण से दो सत्रों लिंक कर सकते हैं।
वाइसवर्सा थोड़ा सा ट्रिकियर है क्योंकि धूमकेतु में HttpSession
जैसे निष्क्रियता टाइमआउट की अवधारणा नहीं है। इसे अपने तर्क के साथ आवेदन में लागू किया जाना चाहिए।
एक कर का हिस्सा है, ServerSession
पर एक RemoveListener
रजिस्टर करने के लिए है कि तरह है:
serverSession.addListener(new ServerSession.RemoveListener()
{
public void removed(ServerSession session, boolean timeout);
{
if (!timeout)
{
// Explicitly disconnected, invalidate the HttpSession
httpCometDMapper.invalidate(session);
}
}
});
यह श्रोता ग्राहक से स्पष्ट डिस्कनेक्ट (और सर्वर - reentrancy से सावधान) के लिए देखता है।
थोड़ा अधिक कठिन गैर स्पष्ट डिस्कनेक्ट के लिए एक ही तंत्र को लागू करने के लिए है।इस मामले में, timeout
पैरामीटर सत्य होगा, लेकिन अस्थायी नेटवर्क विफलता (क्लाइंट के विपरीत गायब होने के विपरीत) के कारण हो सकता था, और उसी उपयोगकर्ता ने पहले से ही ServerSession
के साथ फिर से हाथ से पकड़ लिया होगा।
मुझे लगता है कि इस मामले में एक एप्लिकेशन टाइमआउट समस्या हल कर सकता है: जब आप ServerSession
को टाइमआउट के कारण हटा देते हैं, तो आप उस उपयोगकर्ता को नोट करते हैं और एप्लिकेशन टाइमआउट शुरू करते हैं। यदि एक ही उपयोगकर्ता फिर से हैंडशेक, एप्लिकेशन टाइमआउट रद्द करें; अन्यथा उपयोगकर्ता वास्तव में चला गया है, एप्लिकेशन टाइमआउट समाप्त हो जाता है, और आप HttpSession
को भी अमान्य कर देते हैं।
ऊपर क्या विचार और सुझाव हैं; वास्तविक कार्यान्वयन आवेदन विवरण पर भारी निर्भर करता है (और यही कारण है कि धूमकेतु द्वारा बॉक्स के बाहर प्रदान नहीं किया जाता है)।
प्रमुख बिंदु नक्शा हैं, HttpSessionListener
और RemoveListener
, और उन घटकों के जीवन चक्र को जानना। एक बार जब आप इसे प्रबंधित कर लेंगे, तो आप सही कोड लिख सकते हैं जो आपके आवेदन के लिए सही चीज करता है।
अंत में, ध्यान दें कि धूमकेतु HttpSession
के साथ BayeuxContext
उदाहरण के माध्यम से बातचीत करने का एक परिवहन-अज्ञेय तरीका है, जिसे आप BayeuxServer.getContext()
से प्राप्त कर सकते हैं। मेरा सुझाव है कि आप यह भी देखें कि यह चीजों को सरल बना सकता है, खासकर HttpSession
में संग्रहीत टोकन को पुनर्प्राप्त करने के लिए।