2011-12-25 12 views
5

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

@Scheduled(fixedRate = 2000) 
    public void getData(){ 
        // TODO Auto-generated method stub 
        DeviceDetails deviceDetails = realTimeDataDAO.getDeviceDetails(deviceId); 
        System.out.println(deviceDetails); 
       } 

मुझे हर 2 सेकंड के बाद कुछ डेटा प्रदर्शित करना होगा। क्या कोई मुझे बता सकता है कि ऐसा कैसे करें?

कोई भी Comet अजाक्स पुश प्रौद्योगिकी के बारे में जानता है, क्या यह इस परिदृश्य में काम करेगा?

+0

अभी उत्तर दिया गया - यदि आपने कहा कि आप किस ऐप सर्वर का उपयोग कर रहे हैं - या यदि आप चुनने के लिए लचीले हैं तो यह सहायक होगा। – Pablojim

उत्तर

2

वसंत के साथ आपकी सबसे अच्छी शर्त निर्धारित अवधि के परिणामों को स्मृति में बीन में संग्रहीत करना है, फिर एक अन्य अनुरोध-स्कोप बीन उस वेब साइट पर पहुंचने वाली विधि में संग्रहित परिणाम प्राप्त करें, और इसे टेक्स्ट के रूप में वापस करें (या JSON)। वैकल्पिक रूप से आप डीबी से प्रत्येक बार एक अनुरोध का अनुरोध कर सकते हैं पूछ सकते हैं।

फिर, आप अपने पृष्ठ से एक समय एसिंक अनुरोध कर सकते हैं (आप इसके लिए यूयूआई कनेक्शन मैनेजर का उपयोग करना चाह सकते हैं), प्रतिक्रिया पढ़ें और google.maps.Map से पैनटो विधि का उपयोग अपने मानचित्र स्थान को अपडेट करने के लिए करें।

जैसा कि आप देख सकते हैं, समाधान जावा और एक जावास्क्रिप्ट भाग में विभाजित है।

जावा पक्ष के लिए, आपको एक नियंत्रक बनाना होगा जो डेटाबेस को क्वेरी करता है (या बेहतर अभी तक, उस कार्य को किसी अन्य परत पर प्रतिनिधि करता है) और जेएसओएन के रूप में परिणाम देता है, आप इसके लिए http://spring-json.sourceforge.net/ का उपयोग कर सकते हैं। यह वसंत में थोड़ा जटिल है, इसलिए आप इसके बजाय एक सरल सर्वलेट बनाना चाहते हैं जो डेटा देता है।

जावास्क्रिप्ट पक्ष के लिए, जब आपके पास कार्यकारी endpoint कि JSON डेटा देता है, YUI Connection Manager और google maps api का उपयोग कर:

function update(){ 
    var callback = { 
     success: function (o) { 
      var response = YAHOO.lang.JSON.parse(o.responseText); 
      map.panTo({lat: response.lat, lng: response.longi}); // map is the google.maps.Map representing your map 
     }, 
     failure: function (o) { 

     } 
    } 
    var sUrl = '/getData.htm'; // This is the request mapping for your bean 
    YAHOO.util.Connect.asyncRequest('GET', sUrl,callback); 
} 

function init(){ 
    setTimeout("update()", 2000); 
} 
+0

क्या आप मुझे कुछ उदाहरण कोड के साथ स्पष्ट रूप से समझा सकते हैं। –

+0

मैंने कुछ दिशानिर्देश और उदाहरण कोड जोड़ा, उम्मीद है कि यह – Slash

+0

आपको बहुत धन्यवाद @ स्लैश, लेकिन यूयूआई के अलावा कोई अन्य तरीका है, becoz मुझे उस पर कोई ज्ञान नहीं है। –

1

TimerTask या ThreadExecutor (निर्धारित कार्यान्वयन को देखें) आज़माएं।

+0

क्या आप मुझे उदाहरण कोड कर सकते हैं .. –

+0

http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshavepassed.htm – duffymo

+0

मुझे नहीं लगता कि यह वास्तव में मदद करता है क्योंकि यह डेटा को प्रदर्शित करने से संबंधित नहीं है उपयोगकर्ता – Edd

1

ठीक है, अगर आप वेब एप्लिकेशन में उपरोक्त समाधान को कार्यान्वित करना चाहते हैं तो मुझे यकीन नहीं है लेकिन मुझे लगता है कि आप इसे इस तरह से नहीं कर सकते हैं। HTTP एक अनुरोध/प्रतिक्रिया प्रोटोकॉल है और जब सर्वर एक प्रतिक्रिया भेजना समाप्त करता है तो वह अपनी नई प्रतिक्रिया भेजने पर शुरू नहीं कर सकता है। संक्षेप में: क्लाइंट से एक अनुरोध - सर्वर से एक प्रतिक्रिया।

मुझे लगता है कि आपको AJAX (एसिंक्रोनस जावास्क्रिप्ट अनुरोध) का उपयोग करना चाहिए ताकि सर्वर को प्रत्येक 2 सेकंड के लिए एक नए डेटा के लिए पूछने के लिए और यदि आवश्यक हो तो डीओएम (वेबसाइट एचटीएमएल टैग संरचना) अपडेट करें।

+0

मुझे लगता है कि यह AJAX के माध्यम से अनुरोध भेजने का अच्छा तरीका नहीं है, क्योंकि हर बार हमें एक ही डेटाबेस तालिका को हिट करने की आवश्यकता होती है। इसलिए यदि हम एक जावा डिमन थ्रेड लिखते हैं जो पृष्ठभूमि चलाता है और लगातार यूआई को डेटा भेजता है। –

+0

यह एक बुरा विचार की तरह लग सकता है लेकिन यह एक वेब अनुप्रयोगों में एक आम समाधान है :) –

+0

@ एम। Hryszczyk आप शायद एक दशक पहले सही होगा। HTTP के लिए मूल कल्पना जैसा कि आप कहते हैं, लेकिन इसके प्रसार और पुश क्षमताओं के लिए सामान्य आवश्यकता ने लगभग हर सर्वर प्लेटफॉर्म पर सर्वर-पुश स्ट्रीमिंग कार्यान्वयन जैसे धूमकेतु के * दर्जन * को जन्म दिया है। सर्वर-प्रेषित घटनाक्रम और वेब सॉकेट केवल इस विकास को आगे बढ़ाएंगे, दोनों को चतुराई से http/पोर्ट 80 पर सह-अस्तित्व में तैयार किया जाएगा। – BenSwayne

2

ऐसा करने का सबसे अच्छा तरीका क्लाइंट को नया प्रत्येक 2 सेकंड का अनुरोध करने के लिए है, और फिर नया डेटा प्रदर्शित करें।

चूंकि आप HTTP का उपयोग करते हैं, मुझे लगता है कि आप क्लाइंट पक्ष पर जावास्क्रिप्ट का उपयोग करते हैं, इसलिए आपको अपने जावास्क्रिप्ट में एक टाइमर चाहिए जो हर 2 सेकंड में आग लगती है, और फिर जावास्क्रिप्ट को डेटा प्राप्त करने के लिए सर्वर पर AJAX कॉल करने दें फिर प्रदर्शित कर सकते हैं।

0
//Initialize this somewhere 
ScheduledExecutorService exe = Executors.newScheduledThreadPool(1); 

exe.scheduleWithFixedDelay(new Runnable() { 

    @Override 
    public void run() { 
     //The executor service tries to run 2 seconds after it last finished 
     //If you code takes 1 second to run this will effectively run every 3 seconds 
    } 
}, 0, //this is the initial delay 
2, //this is the consecutive delay 
TimeUnit.SECONDS); 

exe.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
     //The executor service tries to run this every 2 seconds 
     //If you code takes 1 second to run this will still run evey 2 seconds 
    } 
}, 0, //this is the initial delay 
2, //this is the period it tries to run in 
TimeUnit.SECONDS); 
+0

धन्यवाद दोस्त, क्या आप कृपया मुझे बताएं कि jsp पेज को कैसे अपडेट करें। प्रत्येक 2 सेकंड के लिए इस विधि को चलाने के बाद , मुझे डेटा प्राप्त करना होगा और jsp –

+0

AJAX पर धक्का देना होगा और धूमकेतु को काम करना चाहिए। आपको या तो जावा सर्वर घटक ढूंढना या लिखना होगा जिसे आप डेटा को धक्का दे सकते हैं और एक जावास्क्रिप्ट क्लाइंट घटक भी जो उपयोगकर्ता के ब्राउज़र में डेटा "प्राप्त" करेगा। – patheros

+0

सबसे कठिन हिस्सा क्लाइंट के लिए कस्टम जावास्क्रिप्ट लिख रहा है जो उस पृष्ठ के हिस्सों को अपडेट करता है जो आप चाहते हैं। आप किसी भी जेएसपी टैग का उपयोग करने में सक्षम नहीं होंगे क्योंकि पृष्ठ का पहला लोड होने पर उनका मूल्यांकन किया जाता है। – patheros

0

आपको प्रत्येक 2 सेकंड के लिए सर्वर से क्लाइंट को डेटा भेजने की आवश्यकता है। और पहले से ही आप जानते हैं कि सर्वर की तरफ हर 2 सेकंड के लिए डेटा कैसे इकट्ठा करना है।

यदि आपको यह आवश्यक है, तो "अजाक्स स्ट्रीमिंग" आपकी मदद करेगी। यह ग्राहक पक्ष पर है। सर्वर 2 से प्रत्येक 2 सेकंड के लिए आपको डेटा लिखने और इसे फ्लश करने की आवश्यकता होती है।

इस अवधि के लिए खोज आपको बहुत सारे उदाहरण देगा। लेकिन याद रखें कि सभी आधुनिक ब्राउज़र एक दृष्टिकोण का उपयोग करेंगे और सभी आईई ब्राउज़र स्ट्रीमिंग को लागू करने के लिए आईफ्रेम दृष्टिकोण का उपयोग करेंगे।

पहले मामले में, आपको XHR अनुरोध करने और प्रतिक्रिया को देखने और इसे संसाधित करने की आवश्यकता है।

यहाँ कुछ उदाहरण हैं: (मैं didt उन के माध्यम से पूरी तरह से जाने के लिए समय है)

http://ajaxpatterns.org/HTTP_Streaming

http://developers.cogentrts.com:8080/DH_ajax_1.asp

-1

अपने सर्वर 1000 से अधिक उपयोगकर्ताओं हो जाता है, तो आपके आवेदन सर्वर विफल हो जाएगा। मैं अनुशंसा करता हूं कि आप इस प्रयोजन के लिए किए गए अनुरोधों को होस्ट करने के लिए केवल जेटी सर्वर का उपयोग करके समर्थित गैर ब्लॉकिंग इनपुट आउटपुट विधियों का उपयोग करें और अन्य अनुप्रयोगों के लिए अपने सामान्य ईई सर्वर का उपयोग करें।

+0

मुझे लगता है कि यह ट्रैक से बाहर जा रहा है – Avil

+0

@BigFatPig उन उत्तरों को पोस्ट न करें जिनके लिए आपके पास जानकारी का विश्वसनीय स्रोत नहीं है। मैं नियमित रूप से [WebSync] (http://www.frozenmountain.com/websync/ "आईआईएस के लिए वेबसिंक धूमकेतु सर्वर) के साथ एक सर्वर पर 20,000 क्लाइंट का परीक्षण करता हूं और सर्वर क्लस्टर नियमित रूप से 4000-6000 एक साथ वास्तविक दुनिया उपयोगकर्ताओं को देखता हूं। – BenSwayne

0

यू AJAX कॉल का उपयोग कर सकते हैं। जैसा कि आप जावास्क्रिप्ट से कोड लिख सकते हैं जो प्रत्येक 2 सेकंड के लिए अनुरोध भेज देगा, लेकिन इसके लिए आपके सर्वर को इस प्रकार के अनुरोध के लिए त्वरित उत्तरदायी होना चाहिए।

अच्छी तरह से मुझे लगता है कि यह आपकी मदद करेगा।

5

आपके पास कई विकल्प हैं।

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

लंबे मतदान - धूमकेतु के रूप में भी जाना जाता है यह अनिवार्य रूप से एक लंबे समय तक अनुरोध है। इसका कार्यान्वयन आपके ऐप सर्वर के आधार पर अलग-अलग होगा। टॉमकैट के लिए यहां देखें: http://wiki.apache.org/tomcat/WhatIsComet या जेटी कुछ उदाहरणों को बंडल करता है।

एचटीएमएल 5 समाधान जबकि वेब पारंपरिक रूप से प्रतिक्रिया आधारित अनुरोध का अनुरोध करता है - ईवेंट आधारित प्रसंस्करण एचटीएमएल 5 स्पेक का हिस्सा है। जैसा कि आप घटनाएं केवल एक ही तरीका (सर्वर -> क्लाइंट) प्रतीत होती हैं, इवेंट स्रोतों का उपयोग करने पर विचार करें। देखें: http://www.html5rocks.com/en/tutorials/eventsource/basics/ या फिर जेटी उदाहरण। यहां चेतावनी दी गई है कि केवल आधुनिक ब्राउज़र और कुछ ऐप सर्वर इन विधियों का समर्थन करते हैं - उदा। अपाचे नर्सलेट्स का मूल रूप से समर्थन नहीं करता है।

तो समेकित करने के लिए - मेरी आंत महसूस यह है कि आपकी ज़रूरतें और सादगी के लिए एक मतदान दृष्टिकोण ठीक है - शुरुआत के मुद्दों के बारे में बहुत ज्यादा चिंता न करें।

यदि आप अत्याधुनिक होना चाहते हैं, तो नई बात सीखें और आपके ऐप सर्वर और ढांचे पर नियंत्रण है तो मैं HTML 5 दृष्टिकोण के लिए जाऊंगा।

धूमकेतु इन दोनों के बीच आधा रास्ता घर है।

+0

हाय पाब्लोजिम, मैं टॉमकैट का उपयोग वसंत + हाइबरनेट + गूगल मैप्स एपीआई वी 3 के साथ सर्वर के रूप में कर रहा हूं। मुझे एचटीएमएल 5 के बारे में कोई जानकारी नहीं है, क्या आप मुझे मार्गदर्शन कर सकते हैं। –

1

मैं WebSockets के साथ अच्छा अनुभव है। सर्वर और ब्राउज़र के बीच बहुत तेज़, कम ओवरहेड द्वि-दिशात्मक प्रोटोकॉल। सुनिश्चित नहीं है कि आपका बैकएंड क्या है लेकिन जेटी इसे बहुत अच्छी तरह से समर्थन देता है।बैकएंड पर बस एक टाइमर प्रक्रिया है जो सभी सक्रिय वेबसाकेट सत्रों को फिर से चालू करेगी और अद्यतनों को धक्का देगी। Websockets का उपयोग करने के नेट पर बहुत उदाहरण हैं।

ध्यान रखने योग्य बातें करने के लिए:

  • सभी ब्राउज़र द्वारा समर्थित नहीं WebSockets
  • WebSockets यातायात सभी प्रॉक्सी पार नहीं करता है (क्रोम और सफारी सबसे अच्छा समर्थित किया जा रहा है)

आपकी आवश्यकताओं के आधार पर यह स्वीकार्य हो सकता है या नहीं।

Atmosphere जैसी कुछ परियोजनाएं हैं जो धूमकेतु में शानदार फॉलबैक के साथ websockets समर्थन में अमूर्त ब्राउज़र/सर्वर अंतरों का प्रयास करती हैं। यह देखने लायक हो सकता है।

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