如何在Web工程中实现任务计划调度
下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。
我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示(为考虑篇幅,仅提供部分代码供读者参考):
1. private java.util.Timer timer = null;
2. public void contextInitialized(ServletContextEvent event) {
3. timer = new java.util.Timer(true);
4. event.getServletContext().log("定时器已启动");
5. timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);
6. event.getServletContext().log("已经添加任务调度表");
7. }
8. public void contextDestroyed(ServletContextEvent event) {
9. timer.cancel();
10. event.getServletContext().log("定时器销毁");
11. }
以上代码中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单,不再详细说明。
下面介绍MyTask的实现,上面的代码中看到了在构造MyTask时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载MyTask的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示:
1. private static final int C_SCHEDULE_HOUR = 0;
2. private static boolean isRunning = false;
3. private ServletContext context = null;
4. public MyTask(ServletContext context) {
5. this.context = context;
6. }
7. public void run() {
8. Calendar cal = Calendar.getInstance();
9. if (!isRunning) {
10. if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
11. isRunning = true;
12. context.log("开始执行指定任务");
13.
14. //TODO 添加自定义的详细任务,以下只是示例
15. int i = 0;
16. while (i++ < 10) {
17. context.log("已完成任务的" + i + "/" + 10);
18. }
19.
20. isRunning = false;
21. context.log("指定任务执行结束");
22. }
23. } else {
24. context.log("上一次任务执行还未结束");
25. }
26. }
上面代码中“//TODO……”之下四行是真正被调度执行的演示代码(在我的财政数据中心项目中就是报表计算过程),您可以换成自己希望执行的语句。
到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:
<listener>
<listener-class>com.test.ContextListener</listener-class>
</listener>
当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行,上面的代码会在Tomcat的日志文件中记录如下:
2003-12-05 0:21:39 开始执行指定任务
2003-12-05 0:21:39 已完成任务的1/10
……
2003-12-05 0:21:39 已完成任务的10/10
2003-12-05 0:21:39 指定任务执行结束
分享到:
相关推荐
本文将深入探讨如何在Tomcat中实现定时任务,主要涉及的知识点包括Java的定时器(Timer)和Spring框架的TaskScheduler。 首先,让我们了解一下Java中的定时任务。在Java标准库中,有一个名为`java.util.Timer`的类...
Java定时任务是软件开发中的一个重要组成部分,特别是在服务端应用程序中,常常需要在特定时间执行某些操作,例如数据备份、清理过期数据、发送通知等。SpringBoot框架为开发者提供了便捷的方式来实现这些定时任务,...
4. **部署与测试**:项目部署在Tomcat服务器上,当服务器启动时,Quartz会自动加载数据库中的定时任务。通过监控日志或者定制的监控界面,可以观察到定时任务的执行情况,验证其是否按照预期工作。 5. **Spring的...
1. **计划任务**:大多数操作系统(如Windows、Linux)都提供了内置的任务调度器,可以用来设置定时任务。在Windows中,我们可以使用“任务计划程序”创建一个新任务来执行重启Tomcat的操作;在Linux系统中,可以...
在Servlet容器(如Tomcat)中,可以通过监听器(Listener)或者Servlet的初始化方法来创建和启动定时器,以实现在Web应用启动后自动开始执行定时任务。 此外,Java 5引入了`java.util.concurrent`包,其中的`...
我们通常写的timer都是用main方法写的定时器,但同样我们也需要根据服务器启动后定时器也启动的 定时执行任务。不过有个致命伤就是集群方面跟quartz不能比,此方法代码做参考不错,如果要用,那么这个方法在一台...
首先,我们要了解Tomcat中的定时任务通常通过Java的定时框架来实现,最常见的是Java的ScheduledExecutorService或者使用Spring框架的TaskScheduler。这两种方式都可以在Tomcat容器内创建定时任务。 1. **使用...
本文将详细介绍如何利用Apache Tomcat(一个广泛使用的Java应用服务器)与Jenkins(一个开源持续集成/持续部署工具)来创建定时任务,实现电脑自动重启以及Tomcat的开机自启动。 首先,我们需要理解Tomcat的开机自...
Java定时任务通常使用`java.util.Timer`类、`java.util.concurrent.ScheduledExecutorService`或者Spring框架的`@Scheduled`注解来实现。在`analyData`项目中,可能是使用了Spring Boot框架,利用`@Scheduled`注解...
Java中可以使用内置的`java.util.Timer`和`java.util.TimerTask`类或者更先进的`ScheduledExecutorService`来创建定时任务。定时任务会定期检查TXT文件的内容,如果文件有更新,就提取新内容并构造钉钉消息。 本地...
综上所述,"tomcat启动时定时循环执行内容(action)"涉及的是如何在Tomcat启动时通过Java原生或者Spring框架设置定时任务,实现服务器启动后的自动周期性执行。这样的功能在很多场景下都有实际的应用价值,如日志清理...
【描述】:本文将详细介绍如何配置Tomcat进行定时重启,包括Tomcat绿色版的注册为系统服务、调整内存设置、创建批处理文件和设置系统计划任务。 【标签】:“Tomcat” 【正文】: Tomcat是一款广泛使用的开源Java...
这样,我们就设置了一个定时任务,按照指定时间自动执行restart.bat,从而实现Tomcat的定时重启。 值得注意的是,这种方法适用于小型项目或者测试环境,对于生产环境,我们可能需要更复杂和灵活的解决方案,如使用...
Quartz是一个开源的作业调度框架,而Spring框架则为Java应用程序提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,将两者结合,可以在Spring管理的bean中无缝集成定时任务。 Quartz的核心概念包括Job、...
在本文中,我们将深入探讨如何使用Java和Spring Boot框架构建一个基于秒级的定时任务管理系统,同时结合layui前端UI库来提升用户体验。Spring Boot以其快速启动、简化配置和丰富的生态系统,已经成为Java开发中的...
轻松实现tomcat定时重启 首先修改jsp.bat中的两个路径,其中set JAVA_HOME后面是jdk路径,下面是tomcat路径;运行,执行注册。 然后修改tomcat.bat中的ping 127.0.0.1 -n 5(暂停时间) 最后将tomcat.bat添加的计划...
Java定时发送邮件是一种常见的自动化任务,常常用于通知、提醒或者定期报告等场景。在这个实例中,我们将探讨如何使用Java编程语言结合电子邮件服务实现一个定时发送邮件的功能。这涉及到的主要知识点包括JavaMail ...
6. **部署项目**:将项目打包成WAR文件,部署到Tomcat等Web服务器的WEB-INF目录下,启动服务器后,Quartz就会按照配置开始执行定时任务。 在给定的压缩包文件中,`META-INF`和`WEB-INF`是WAR文件的标准目录结构。`...
部署时,只需将脚本和相关的依赖文件(如Tomcat)复制到目标机器上,然后在该机器上创建相应的定时任务。 总结,定时启动Tomcat应用服务器批处理脚本是一种实用的运维工具,通过结合Windows的任务计划程序,我们...