【问题标题】:Launching background threads on GWT startup在 GWT 启动时启动后台线程
【发布时间】:2009-02-11 21:24:37
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java multithreading gwt


    【解决方案1】:

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

    更好的方法是照你说的做,例如:配置你的 web 项目以在启动时启动课程。您可以按照此处所述在 web.xml 中执行此操作:

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

    以下是 Stripes 的示例:

    <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>
    

    【讨论】:

      【解决方案2】:

      我不同意您应该将代码放入 servlet 初始化中以创建这些线程。当 Web 应用程序停止时,您将无法控制何时销毁这些线程。此外,当您再次启动网络应用程序时,它是否会再次创建这些线程?

      更好的是使用名为 contextInitialized 的 J2EE ServletContextListener 事件来创建线程并使用 contextDestroyed 事件来销毁您的线程。这还允许您控制线程销毁并在销毁线程之前等待线程中的代码完成执行。

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

      【讨论】:

        【解决方案3】:

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

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

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

        无论哪种方式,客户端请求都会检索预先生成的图表。生成新图表时,只需将其替换为旧图表,这样用户就不会出现明显的延迟。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 正如你所说,它进行编组。 GWT 还处理方法绑定,这很有帮助。我说它既是前端又是后端的意思是反对 GWT 仅适用于客户端的概念,并且您必须将它与后端的某些东西结合起来。您只需实现 servlet 方法。
          猜你喜欢
          • 2011-10-26
          • 1970-01-01
          • 2016-02-23
          • 1970-01-01
          • 2020-10-15
          • 1970-01-01
          • 1970-01-01
          • 2023-01-30
          • 2019-01-25
          相关资源
          最近更新 更多