Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在GWT启动时启动后台线程_Java_Multithreading_Gwt - Fatal编程技术网

Java 在GWT启动时启动后台线程

Java 在GWT启动时启动后台线程,java,multithreading,gwt,Java,Multithreading,Gwt,我有一个GWT应用程序,它显示JFreeChart呈现的一些图表。每隔几分钟,页面就会刷新,这会导致应用程序生成新的图表。(换句话说,整个图表生成过程都是由一个客户端请求引导的。)问题是,多个客户端访问同一台服务器会导致多个生成图表的请求,但由于所有用户的图表都是相同的,因此没有理由这样做。我希望在后台线程中预呈现图表,该线程将在应用程序启动时启动,然后根据请求将已呈现的图表提供给客户端 我在GWT中看不到任何在服务器启动时执行您自己的代码的“认可”方式。我能想到的实现这一点的唯一方法是创建一个

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

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

有没有更可取的方法


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

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

更好的方法是按照你说的做,例如:配置你的web项目,在启动时启动一个类。您可以在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>

条带调度器
net.sourceforge.stripes.controller.DispatcherServlet
1.
条带调度器
*.行动

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

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

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


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

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


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

我不同意您应该在servlet初始化中添加代码来创建这些线程。当web应用程序停止时,您将无法控制何时销毁这些线程。此外,当您再次启动web应用程序时,它是否会再次创建这些线程

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

看起来这解释了它的工作原理:

正如您所说,它执行编组。GWT还处理方法绑定,这很有用。我之所以说它是前端和后端,是为了反驳GWT只是为客户服务的观点,你必须把它和后端的东西结合起来。您只需实现servlet方法。