黑马程序员技术交流社区

标题: 【西安校区】Timer与Spring的定时任务task [打印本页]

作者: 西安Java组    时间: 2018-2-1 13:01
标题: 【西安校区】Timer与Spring的定时任务task
本帖最后由 西安Java组 于 2018-2-1 13:01 编辑

第一种实现方式 : Timer
Timer类是由JDK提供的,可以用来执行简单的定时任务;
1).延迟执行任务, 任务只执行一次
[Java] 纯文本查看 复制代码
public static void main(String[] args){
               
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, 2000);
               
}

2).延迟一定时间执行任务, 任务周期性执行
[Java] 纯文本查看 复制代码
public static void main(String[] args){
        
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, 2000, 1000);
        
}

3).任务到达时间后执行 , 仅执行一次

[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        
        System.out.println(new Date() +" : 程序开始执行  ...");
        Timer timer = new Timer();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.SECOND, 30);
        
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, calendar.getTime());

}

4).任务到达时间后执行 , 之后每隔一段时间执行

[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        
        System.out.println(new Date() +" : 程序开始执行  ...");
        Timer timer = new Timer();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.SECOND, 10);
        
        timer.schedule(new TimerTask() {
                @Override
                public void run() {
                        System.out.println(new Date() + " : It is time to send mail to leader ... ");
                }
        }, calendar.getTime(),3000);

}

上述JDK提供的定时器只能够执行一些简单的定时任务 , 一些稍微复杂些的定时实现起来比较麻烦 ; 比如 , 需要实现上午09:00下午 18:00 执行定时任务发送邮件 ;

第二种实现方式 : Spring对定时任务的支持scheduled-tasks

1).引入依赖
只需要引入核心依赖就可以了
[Java] 纯文本查看 复制代码
<dependencies>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-beans</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-context</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-core</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
         <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-expression</artifactId>
                 <version>4.2.4.RELEASE</version>
         </dependency>
</dependencies>

2).定义任务类
就是一个简单的java类 , 其中定义任务方法sendMail()
[Java] 纯文本查看 复制代码
public class MyTask1 {
        
        public void sendMail(){
                System.out.println(new Date() + " : It is time to send mail to leader ...");
        }
        
}
3).配置任务bean
将定义好的任务类, 交给spring容器管理
[XML] 纯文本查看 复制代码
<bean id="task1" class="timerdemo.MyTask1"></bean>

4). 配置任务
   A. 延迟一段时间执行第一次任务,之后每隔固定时间(是从上一次任务执行完成时间开始计算)执行
[XML] 纯文本查看 复制代码
<task:scheduled-tasks>
        <task:scheduled ref="task1" method="sendMail" initial-delay="2000" fixed-delay="5000"/>
</task:scheduled-tasks>

   ref : 指任务类的bean的id
    method : 任务类中的具体执行任务的方法名
    initial-delay: 第一次执行任务的时候延迟时间 , 需要配置fixed-rate 或 fixed-delay使用
    fixed-delay: 执行的时间周期 (是从上一次任务执行完成时间开始计算)

    B. 延迟一段时间执行第一次任务, 之后每隔固定时间(是从上一次任务执行开始时间开始计算)执行
[XML] 纯文本查看 复制代码
<task:scheduled-tasks>
        <task:scheduled ref="task1" method="sendMail" initial-delay="2000" fixed-rate="5000"/>
</task:scheduled-tasks>

   ref : 指任务类的bean的id
    method : 任务类中的具体执行任务的方法名
    initial-delay: 第一次执行任务的时候延迟时间 , 需要配置fixed-rate 或 fixed-delay使用
    fixed-rate: 执行的时间周期 (是从上一次任务执行开始时间开始计算)

   C. 按照执行的cron表达式指定的时间执行任务
[XML] 纯文本查看 复制代码
        <task:scheduled-tasks>
                <task:scheduled ref="task1" method="sendMail" cron="0 0 9,18 * * *"/>
        </task:scheduled-tasks>
    上述表达式含义 : 每天上午09:00:00 下午的 18:00:00 执行任务

cron表达式介绍 :
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素
按顺序依次为 :
         ------------0~59
        分钟 ----------0~59
        小时 ----------0~23
         ------------0~31,但是你需要考虑你月的天数)
         ------------0~11
        (星期) -----1~7 1=SUN SUNMONTUEWEDTHUFRISAT
        年份 ---------19702099
其中每个元素可以是一个值(6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。
Cron表达式的样例 :
    0 0 10,14,16 * * ?              每天上午10点,下午2点,4
    0 0/30 9-17 * * ?           朝九晚五工作时间内每半小时
    0 0 12 ? * WED                  表示每个星期三中午12
    0 0 12 * * ?                    每天中午12点触发
    0 15 10 ? * *                   每天上午10:15触发
    0 15 10 * * ?                   每天上午10:15触发
    0 15 10 * * ? *                 每天上午10:15触发
    0 15 10 * * ? 2005              2005年的每天上午10:15触发
    0 * 14 * * ?                    在每天下午2点到下午2:59期间的每1分钟触发
    0 0/5 14 * * ?                  在每天下午2点到下午2:55期间的每5分钟触发
    0 0/5 14,18 * * ?               每天14点到2:55期间和18点到6:55期间每5分触发
    0 0-5 14 * * ?                  在每天下午2点到下午2:05期间的每1分钟触发
    0 10,44 14 ? 3 WED              每年三月的星期三的下午2:102:44触发
    0 15 10 ? * MON-FRI             周一至周五的上午10:15触发
    0 15 10 15 * ?                  每月15日上午10:15触发
    0 15 10 L * ?                   每月最后一日的上午10:15触发
    0 15 10 ? * 6L                  每月的最后一个星期五上午10:15触发
    0 15 10 ? * 6L 2002-2005        2002年至2005年每月最后一个星期五10:15触发
    0 15 10 ? * 6#3                 每月的第三个星期五上午10:15触发


作者: JavaEE风清扬    时间: 2018-2-1 13:43
不错, 不错 ...........
作者: #风萧萧#    时间: 2018-2-1 13:48
不错, 不错 ...........
作者: #风萧萧#    时间: 2018-2-1 15:48
棒棒哒 ..............
作者: #风萧萧#    时间: 2018-2-2 17:35
棒棒哒 ..............
作者: 321哈哈哈    时间: 2018-2-8 20:12
棒棒哒 ..............




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2