2011-12-25 59 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服务器的差异优美后备彗星支持。这可能值得一看。

相关问题