我有一个普通的 .java 类。在该课程中,我使用Timer
课程安排方法来安排任务。
问题是我正在使用 Java EE 应用程序,但我不知道在哪里实例化这个类;来自 Servlet 或类似的东西?当我的应用程序启动时,我只想实例化该类一次。
我有一个普通的 .java 类。在该课程中,我使用Timer
课程安排方法来安排任务。
问题是我正在使用 Java EE 应用程序,但我不知道在哪里实例化这个类;来自 Servlet 或类似的东西?当我的应用程序启动时,我只想实例化该类一次。
你可能需要一个ServletContextListener
和它的方法contextInitialized(..)
。它在您的应用程序初始化时被调用一次。
您在 web.xml 中使用@WebListener
或使用映射侦听器<listener><listener-class>..</...>
public class YourServlet extends HttpServlet {
private YourClass instance;
public void init() throws ServletException {
instance = new YourClass();
}
//code
}
通过在 init 方法中实例化您的类,您将确保您的类只被实例化一次,因为在 Java EE 应用程序中,Servlet 仅被加载到服务器内存中一次。
在 Quartz(一种流行的调度程序)中,一种常见的做法是在 Servlet 的 init 方法中配置作业,并将 load-on-startup 属性设置为 true:
从这篇文章,在 web.xml 你应该这样做:
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
然后在你的 servlet 中配置 Jobs:
public class QuartzServlet extends GenericServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
// And continue with your configuration
PS:我强烈推荐你使用 Quartz