java web定时任务调度总结

有时间我们需要服务器在夜深人静的时候,默默执行调度任务。基于java tomcat 的调度任务由以下两种方式(亲自实践过):

一、实现ServletContextListener类

1.SysContextListener类(配置任务定时扫描)

 1 package com.srba.task;
 2
 3
 4 import java.util.Timer;//定时器类
 5
 6 import javax.servlet.ServletContextEvent;
 7 import javax.servlet.ServletContextListener;
 8 public class SysContextListener implements ServletContextListener
 9 {
10   private Timer timer = null;
11   //重写contextInitialized
12   public void contextInitialized(ServletContextEvent event)
13   {
14       //在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
15       timer = new Timer(true);
16       //添加日志,可在tomcat日志中查看到
17       event.getServletContext().log("定时器已启动");
18       System.out.println("+++++++++++++++++++++++++++系统每天调度任务已开启,正在保护地球安全!++++++++++++++++++++++++++++");
19         int i=1000;       //1000毫秒及1秒
20         int s=1000*60*60; //每60分钟执行一次(可以改成1000*2,每2秒扫描一次)
21         Timer timer=new Timer();
22          //调用定时任务,i表示任务无延迟,s表示每隔s毫秒执行任务,触发间隔以毫秒计算。 1秒=1000毫秒。
23         timer.schedule(new TimerAction(event), i, s);
24       event.getServletContext().log("已经添加任务");
25   }
26   //重写contextDestroyed
27   public void contextDestroyed(ServletContextEvent event)
28   {
29       //在这里关闭监听器,所以在这里销毁定时器。
30       timer.cancel();
31       event.getServletContext().log("定时器销毁");
32   }
33 } 

2.TimerAction类(具体要执行的任务)

 1 package com.srba.task;
 2
 3
 4 import java.sql.SQLException;
 5 import java.text.DateFormat;
 6 import java.text.SimpleDateFormat;
 7 import java.util.Date;
 8 import java.util.TimerTask;
 9
10 import javax.servlet.ServletContextEvent;
11
12 import com.srba.web.AllUserInfoMaintenance;
13 public class TimerAction extends TimerTask {
14     private ServletContextEvent myevent;
15     TimerAction(ServletContextEvent event){
16         this.myevent = event;
17     }
18         public void run() {
19             SimpleDateFormat sdf=new SimpleDateFormat("HH");//可以改成new SimpleDateFormat("ss"),精确到秒
20             DateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
21             if(sdf.format(new Date()).equals("01")){// 每天凌晨01点
22                 Date beginDate = new Date();
23                 myevent.getServletContext().log("现在【"+myFormat.format(beginDate)+"】开始执行同步任务!");
24                 AllUserInfoMaintenance task = new AllUserInfoMaintenance();
25                 try {
26                     task.doUpdate();
27                     Date endDate = new Date();
28                     myevent.getServletContext().log("现在【"+myFormat.format(endDate)+"】执行同步任务结束!");
29                 } catch (SQLException e) {
30                     e.printStackTrace();
31                 }
32             }
33         }
34
35 } 

3.在项目的web.xml中的<web-app>节点中加入以下内容(注意包的路径):

  <listener>
    <listener-class>
        com.srba.task.SysContextListener
    </listener-class>
</listener> 

第一种方法就愉快的搞完啦。
二、实现ApplicationListener<ContextRefreshedEvent>类

1.SrbaAutoTask类

 1 package com.srba.siss.rule.task;
 2
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.Timer;
 6 import java.util.TimerTask;
 7
 8 import javax.annotation.Resource;
 9
10 import org.springframework.context.ApplicationListener;
11 import org.springframework.context.event.ContextRefreshedEvent;
12 import org.springframework.stereotype.Service;
13
14 import com.srba.siss.rule.service.SrbaRuleTaskService;
15 import com.srba.siss.rule.service.SystemCurrencyService;
16
17 @Service
18 public class SrbaAutoTask implements ApplicationListener<ContextRefreshedEvent>
19 {
20     @Resource
21     private SrbaRuleTaskService srbaRuleTaskService;
22     @Override
23     public void onApplicationEvent(ContextRefreshedEvent event) {
24         // TODO Auto-generated method stub
25         if(event.getApplicationContext().getParent() == null){
26             System.out.println("+++++++++++++++++++++++++++系统每天调度任务已开启,正在保护地球安全!++++++++++++++++++++++++++++");
27             int i=1000;       //1000毫秒及1秒
28             int s=1000*60*60; //每60分钟执行一次
29             Timer timer=new Timer();
30             timer.schedule(new TimerAction(event), i, s);
31         }
32     }
33
34
35
36
37 }

2.TimerAction()类,同一中的2。

3.配置applicationContext.xml 文件,增加以下内容(tomcat启动spring加载完成后,自动执行下面的类)

<!-- 自动扫描包com.srba.siss.rule.task,执行自动执行任务 -->
    <context:component-scan base-package="com.srba.siss.rule.task"></context:component-scan>

第二种调度方法也愉快的配置完了。

Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。该方法的格式如下:
 void schedule(TimerTask task, Date time)
           安排在指定的时间执行指定的任务。
 void schedule(TimerTask task, Date firstTime, long period)
           安排指定的任务在指定的时间开始进行重复的固定延迟执行。
 void schedule(TimerTask task, long delay)
           安排在指定延迟后执行指定的任务。
 void schedule(TimerTask task, long delay, long period)
           安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。
TimerTask是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。另外它还有两个非抽象的方法:
 boolean cancel()
           取消此计时器任务。
 long scheduledExecutionTime()
           返回此任务最近实际 执行的安排 执行时间。

时间: 2024-10-29 02:58:40

java web定时任务调度总结的相关文章

Java定时任务调度详解

前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券:比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作:比如一些定时需要生成的报表.邮件:比如一些需要定时清理数据的任务等.本篇博客将系统的介绍定时任务调度,会涵盖Timer.ScheduledExecutorService.开源工具包Quartz,以及Spring和Quartz的结合

JAVA定时任务调度之Timer入门详解(二)

在上篇的JAVA定时任务调度之Timer入门详解(一)文章中,主要介绍了下Timer,接下来我们一起来看看Timer的一些常用方法. 1.schedule()的4种用法. 第一种:schedule(TimerTask task, Date time); task:安排的任务,time:具体执行时间.这个函数表达的意义是:在时间等于或超过time的时候执行且执行一次task.测试内容如下 MyTimerTask.java的代码跟第一篇一样,MyTimer.java的部分代码截图如下: 运行后,控制

java定时任务调度工具

一.什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的时间执行次数自动执行的任务. 二.java中常用的定时任务调度工具: Timer Quartz 2.1两者区别: Timer源自jdk,Quartz需要额外引入jar包. Timer功能少,使用方便,能解决许多常见问题.Quartz功能强大,使用麻烦,能解决几乎所有问题. Timer底层通过线程执行定时任务.Quartz底层通过多个线程池执行定时任务. 2.2Timer简介 定义:有且仅有一个后台线程对多个业务线程,进行定时定频率

java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

获取[下载地址]   QQ: 313596790   [免费支持更新] 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器(开发利器)+快速构建表单;            QQ:313596790 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 B 集成阿里巴巴数据库连接池druid;

java sql编辑器 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫 java代码生成器

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势D 集成安全权限框架shiro  Shiro 是一个用 Java 语言

Java Web项目中编写定时任务

之前在的公司有专门的任务调度框架,需要使用的时候引个jar包加个配置和注解就可以使用了,还有专门的平台来维护运行的机器及监控执行状态等等. 现在突然没了这个工具,而又要写定时任务,该怎么办呢? 对于非Web应用来说,我们可以使用Quartz,使用简单,功能强大. 对于Java Web应用来说,当然也可以使用Quartz(有一篇博客介绍了方法:http://blog.csdn.net/sadfishsc/article/details/50808027),但是还有更方便的工具,那就是Spring自

#研发中间件介绍#定时任务调度与管理JobCenter

郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工 没有JobCenter时我们要面对的: 电商业务链条很长,业务逻辑也较为复杂,需要成百上千种定时任务.窝窝的大多数定时任务其实调用的是本地或远端 Java/PHP/Python Web Service.如果没有一个统一的调度和报警,在集群环境下,我们会: 不知道哪一个定时任务执行失败或超时,不见得能第一时间知道——直到最终用户投诉反馈过来: 要求每一个定时任务输出统

MVC模式在Java Web应用程序中的实现

MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器,整合ehcache环境,只需要配置即可.     <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>