2009-02-11 71 views
4

我有一个显示由JFreeChart呈现的一些图表的GWT应用程序。每隔几分钟,页面刷新一次,这会导致应用程序生成新的图表。 (换句话说,整个图表生成过程由客户端请求引导)。问题在于多个客户端命中同一个服务器会导致生成图表的多个请求,但由于所有用户的图表都是相同的,真的没有理由这样做。我希望在后台线程中预渲染图表,并在应用程序启动时启动后台线程,然后根据请求将已提供的图表提供给客户端。在GWT启动时启动后台线程

我没有在GWT中看到任何“认可”的方式来在服务器启动时执行您自己的代码。我能想到的唯一方法就是创建一个在应用程序容器启动时加载的servlet,并在init()方法中启动图表生成线程。

有没有更好的方法来做到这一点?

注意:假设它是真的,“否”是一个完全可以接受的答案。

回答

6

回答你的问题:不可以。GWT是一种前端技术,跨越这条线的唯一GWT是RPC机制。你可以做的唯一的'GWT'类型的方法是检查图表文件在用户第一次请求时是否存在,如果不存在则生成它们。这意味着使用文件系统来检查它是否已创建或尚未创建。

更好的方法是做你说的话,例如:配置你的web项目以在启动时启动一个类。

http://wiki.metawerx.net/wiki/Web.xml.LoadOnStartup

这里的条纹是如何做的一个例子:这里描述你在web.xml中做到这一点

<servlet> 
     <servlet-name>StripesDispatcher</servlet-name> 
     <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>StripesDispatcher</servlet-name> 
     <url-pattern>*.action</url-pattern> 
    </servlet-mapping> 
+0

+1条纹! :) – 2012-09-30 17:01:13

2

首先,我不同意事先海报,GWT是只是一种前端技术,因为该框架包含了异步构建和调用服务的所有内容。例如,请参阅RemoteServiceServlet和用法。 GWT提供客户端和服务器端组件。

话虽如此,GWT似乎并没有专门的启动类型servlet。但是,由于后端是基于servlet的,为了保持一致性,我倾向于使用启动servlet(在google搜索Loading Servlets on Startup),并让它在启动时生成图表,然后根据需要定期生成图表。

另一种方法是让cron作业定期重新构建图表,直接或通过调用私人服务。

无论采用哪种方式,客户端请求都会检索预先生成的图表。当生成一个新图表时,只需将其替换为旧图表,以便用户没有明显的滞后。

0

GWT是一个前端框架。我确实有一些特定的服务器组件,但这些组件仅用于序列化/反序列化客户端的请求。请记住,前端是JavaScript,后端是java。所以服务器组件将一个JavaScript对象转换为它的java表示。如果你看看你的代码,你可以注意到GWT RemoteServiceServlet只是像任何servlet一样继承了标准“javax.servlet.http.HttpServlet”。它只是实现自己的doPost和doGet方法来进行序列化。

这就是说,你的问题可以适用于众多的其他框架。它不依赖于GWT。你只需要配置你的servlet容器在启动时启动GWT RemoteServiceServlet。 servlet可以拥有所有客户端使用的静态缓存并提供相同的图表。然后,您可以在启动时启动第二个线程,以定期更新线程。

+0

它就像你说的那样编组。 GWT也处理方法绑定,这很有帮助。我的观点是,它既是前端也是后端,是为了对抗GWT为客户服务的观念,而且你必须在后端与其结合。您只需实现servlet方法。 – 2009-02-12 13:49:47

3

我不同意你应该把代码放在servlet初始化中来创建这些线程。当Web应用程序停止时,您无法控制何时销毁这些线程。当你再次启动Web应用程序时,它会再次创建这些线程吗?

最好是使用名为contextInitialized的J2EE ServletContextListener事件来创建线程和contextDestroyed事件来销毁您的线程。这也可以让你控制线程销毁并等待线程中的代码在销毁之前完成执行。

看起来这解释了如何工作的: http://www.java-tips.org/java-ee-tips/java-servlet/how-to-work-with-servletcontextlistener.html