2011-12-25 62 views
5

我想每2秒將數據推送到jsp,無需客戶端請求。
我在這裏使用Spring與Hibernate。
我正在顯示谷歌地圖標記,並且我想通過從數據庫中獲取數據來更新標記位置,但是我已經每2秒從數據庫獲取數據,但我無法推送該數據到這個jsp。如何將數據推送到jsp,並且每2秒請求一次?

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

我必須在每隔2秒後顯示一些數據。誰能告訴我該怎麼做?

任何人都知道關於Comet Ajax Push技術,它會在這種情況下工作嗎?

+0

只是簡單地回答 - 如果你說你正在使用的應用程序服務器將是有益的 - 或者,如果你是靈活的上選。 – Pablojim 2012-01-09 19:51:25

回答

2

與Spring最好的辦法是到預定的查詢結果存儲到內存中一個bean,然後還有一個請求範圍豆獲得是通過網絡訪問的方法存儲結果,並返回文本(或JSON)。或者,您可以在每次請求更新時查詢數據庫。

然後,您可以從您的頁面(您可能希望使用YUI連接管理器)進行定時異步請求,讀取響應並使用google.maps.Map中的panTo方法更新您的地圖位置。

正如你所看到的,該解決方案是在Java和JavaScript的一個部分分裂。

對於Java端,您必須創建一個控制器來執行對數據庫的查詢(或者更好的是,將該任務委託給另一個層)並將結果作爲JSON返回,您可以使用http://spring-json.sourceforge.net/。在Spring中它有點複雜,所以你可能想創建一個簡單的servlet來返回數據。

對於JavaScript端,一旦你有一個工作的終點返回JSON數據,使用YUI Connection Managergoogle 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

可以用一些示例代碼清楚地解釋我。 – 2012-01-10 14:21:20

+0

我添加了一些指導方針和示例代碼,希望它可以幫助 – Slash 2012-01-11 20:10:54

+0

非常感謝@Slash,但除YUI之外,還有其他任何方式,因爲我對此沒有任何知識。 – 2012-01-11 21:14:25

1

嘗試使用TimerTaskThreadExecutor(查看計劃實施)。

+0

你能不能我示例代碼.. – 2011-12-29 15:55:49

+0

http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshavepassed.htm – duffymo 2011-12-29 15:57:45

+0

我不認爲這真的有幫助,因爲它不處理顯示數據到用戶 – Edd 2012-01-07 19:07:44

1

那麼,如果你想在web應用程序中實現上述解決方案,我不確定,但我認爲你不能這樣做。 HTTP是一個請求/響應協議,當服務器完成發送一個響應時,它不能發起自己發送一個新的響應。簡言之:來自客戶端的一個請求 - 來自服務器的一個響應。

我認爲你應該使用AJAX(異步Javascript請求),以便每2秒鐘向服務器請求一個新數據,並在必要時更新DOM(網站HTML標籤結構)。

+0

我認爲它不是通過ajax發送請求的好方法,因爲每次我們需要打到同一個數據庫表時。所以如果我們編寫一個運行後臺並將數據連續發送到UI的Java守護程序線程。 – 2011-12-26 04:55:06

+0

它看起來像一個壞主意,但它是在一個Web應用程序:) – 2011-12-26 09:12:39

+0

@ M.Hryszczyk你會是正確的也許是十年前一個通用的解決方案。 HTTP的原始規範就像你說的那樣,但它的流行性和對推送能力的普遍要求導致幾十個像彗星一樣的服務器推送流,幾乎在每個服務器平臺上實現。服務器發送事件和Web套接字只會繼續進一步發展,也​​都巧妙地在http/80端口共存。 – BenSwayne 2012-01-11 16:44:05

2

最好的辦法是讓客戶端每2秒發送一次新的請求,然後顯示新的數據。

由於您使用HTTP,我假設您在客戶端使用JavaScript,因此您需要在您的JavaScript中每2秒觸發一次計時器,然後讓JavaScript執行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 – 2012-01-08 17:35:52

+0

ajax和commet應該工作。你必須找到或者寫一個Java服務器組件,然後你可以將數據推送到一個JavaScript客戶端組件,它將在用戶瀏覽器中「接收」數據。 – patheros 2012-01-08 19:45:33

+0

最難的部分是爲客戶端編寫自定義JavaScript代碼,以更新您想要的頁面部分。您將無法使用任何JSP標記,因爲它們僅在首次加載頁面時進行評估。 – patheros 2012-01-08 19:50:57

0

您需要每2秒將數據從服務器發送到客戶端。而且您已經知道如何在服務器端每2秒收集一次數據。

如果這是您所需要的,「Ajax streaming」將會對您有所幫助。這在客戶端。從服務器端每2秒鐘需要寫入數據並刷新它。

搜索這個詞會給你很多例子。但請記住,所有現代瀏覽器都將使用一種方法,所有IE瀏覽器都將使用IFrame方法來實現流式傳輸。

在第一種情況下,您需要製作XHR請求並查看響應並對其進行處理。

下面是幾個例子:(i didt有時間去通過他們完全)

http://ajaxpatterns.org/HTTP_Streaming

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

-1

如果您的服務器獲得超過1000個用戶,那麼你的應用服務器會失敗。我建議您使用支持使用Jetty Server的非阻塞輸入輸出方法來託管爲此目的而提出的請求,並將其正常的EE服務器用於其他應用程序。

+0

我認爲這是走出軌道 – Avil 2012-01-11 04:39:45

+0

@BigFatPig不要發佈你沒有可靠的信息來源的答案。我經常使用[WebSync](http://www.frozenmountain.com/websync/「WebSync Comet Server for IIS」)在單個服務器上測試20,000個客戶端,並且服務器集羣定期看到4000-6000個同步的真實用戶。 – BenSwayne 2012-01-11 16:49:40

0

U可以使用ajax調用。 正如您可以從Javascript編寫代碼一樣,每2秒發送一次請求,但爲此,您的服務器應該對這種類型的請求做出快速響應。

嗯,我想這會幫助你。

5

您有多種選擇。

Polling - 正如其他答案中所提到的,您可以簡單地讓客戶端中的javascript不斷地每2秒輪詢一次服務器。這是一種非常普遍的方法,很簡單,並且可以在大多數瀏覽器中使用。儘管不像其他方法設置正確,但仍然能夠輕鬆擴展到適中的音量(可能比您擁有更多的用戶!)。

長查詢 - 也被稱爲彗星這本質上是一個長期居住的要求。這個的實現取決於你的應用服務器。請參閱Tomcat:http://wiki.apache.org/tomcat/WhatIsComet或Jetty包含一些示例。

HTML 5解決方案雖然網絡傳統上是基於請求響應 - 基於事件的處理是HTML 5規範的一部分。由於您的事件似乎只有一種方式(服務器 - >客戶端)請考慮使用事件源。請參閱:http://www.html5rocks.com/en/tutorials/eventsource/basics/或再次使用碼頭示例。此處的注意事項是,只有現代瀏覽器和一些應用服務器支持這些方法 - 例如Apache本身不支持websocket。

所以總結起來 - 我的直覺是,您的需求,爲簡單起見,輪詢方法是好的 - 不要擔心太多最初性能問題。

如果你想在刀刃上,學習新的東西,你必須控制你的應用服務器和框架,然後我會去的HTML 5的方法。

彗星是一種這兩者之間的半路上的房子。

+0

嗨Pablojim,我使用Tomcat作爲服務器與春+休眠+谷歌地圖api v3。我對HTML 5沒有任何知識,可以指導我。 – 2012-01-10 14:16:46

1

我曾與WebSockets的好經驗。服務器和瀏覽器之間的非常快速,低開銷的雙向協議。不知道你的後端是什麼,但Jetty非常支持它。只需在後端有一個計時器進程,它可以遍歷所有活動的WebSockets會話並推送更新。網絡上如何使用Websockets有很多例子。

事情要記住:並非所有的瀏覽器都支持

  • 的WebSockets(Chrome和Safari似乎是最好的支持)
  • 的WebSockets流量不會遍歷所有代理

根據您的要求,它可能會或可能不會被接受。

有喜歡Atmosphere它試圖抽象瀏覽器的一些項目/中的WebSockets服務器的差異優美后備彗星支持。這可能值得一看。

相關問題