定时任务

一. spring自带的定时任务功能,基于注解和xml配置

sping配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <task:annotation-driven /> <!-- 定时器开关-->

    <bean id="myTaskXml" class="com.spring.task.MyTaskXml"></bean>

    <task:scheduled-tasks>
        <!-- 
            这里表示的是每隔五秒执行一次 
        -->
        <task:scheduled ref="myTaskXml" method="show" cron="*/5 * * * * ?" />
        <task:scheduled ref="myTaskXml" method="print" cron="*/10 * * * * ?"/>
    </task:scheduled-tasks>

    <!-- 自动扫描的包名 -->  
    <context:component-scan base-package="com.spring.task" />

</beans>

基于XML的定时任务

package com.spring.task;

/**
 * 基于xml的定时器
 */
public class MyTaskXml {


    public void show(){
        System.out.println("XMl:is show run");
    }

    public void print(){
        System.out.println("XMl:print run");
    }
}

基于注解的定时器

package com.spring.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 基于注解的定时器
 */
@Component
public class MyTaskAnnotation {

    /** 
     * 定时计算。每天凌晨 01:00 执行一次 
     */  
    @Scheduled(cron = "0 0 1 * * *") 
    public void show(){
        System.out.println("Annotation:is show run");
    }

    /** 
     * 心跳更新。启动时执行一次,之后每隔2秒执行一次 
     */  
    @Scheduled(fixedRate = 1000*2) 
    public void print(){
        System.out.println("Annotation:print run");
    }
}

二. quartz定时器

定时任务配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"
    default-autowire="byName" default-lazy-init="false">
    <!-- default-autowire="byName" default-lazy-init="false"此两个值可以不配置 -->
    <description>Quartz Job Setting</description>
  <!-- A.配置调度的任务对应bean的id和自定义class-->
  <bean id="myQuartz" class="com.tsxs.tools.Quartz" />
  <!-- B.配置调度任务对应的bean的id和执行的方法,作业不并发调度-->
  <bean id="myDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="myQuartz" />
    <property name="targetMethod" value="tips" />
    <property name="concurrent" value="false" />
  </bean>
  <!-- C.配置调度任务执行的触发的时间-->
  <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="myDetail" />
     <property name="cronExpression">
     <!-- 每分钟的第3秒执行任务调度 -->
      <value>3 * * * * ?</value>
    </property>
  </bean>
  <!-- D.Quartz的调度工厂,调度工厂只能有一个,多个调度任务在list中添加 -->
  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
         <!-- 所有的调度列表-->
        <ref bean="myTrigger" />
<!-- <ref bean="myTrigger1" />
        <ref bean="myTrigger2" />
        对应的bean配置:id="myDetail1" 和 id="myTrigger2" 可以对应的并行多配置-对应执行JavaBean和执行时间(各自触发time)
  -->
      </list>
    </property>
  </bean>
</beans>

定时任务执行JavaBean

package com.tsxs.tools;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class Quartz {
    /**
     * 定时任务,执行方法
     * */
    public void tips(){
        String time = new SimpleDateFormat("MMM d,yyyy KK:mm:ss a",Locale.ENGLISH).format(System.currentTimeMillis());
        System.out.println("time:"+time);
    }
}

注:在定时任务配置中:设置default-lazy-init=”true”,否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false

定时任务时间格式

CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日9:30时”,甚至“每5分钟一班9:00和10:00逢星期一上午,星期三星期五“。
即便如此,SimpleTrigger一样,CronTrigger拥有的startTime指定的时间表时生效,指定的时间表时,应停止(可选)结束时间。

Cron Expressions
cron的表达式被用来配置CronTrigger实例。 cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:

  1. Seconds
  2. Minutes
  3. Hours
  4. Day-of-Month
  5. Month
  6. Day-of-Week
  7. Year (可选字段)
    例 “0 0 12 ? * WED” 在每星期三下午12:00 执行,

个别子表达式可以包含范围, 例如,在前面的例子里(“WED”)可以替换成 “MON-FRI”, “MON, WED, FRI”甚至”MON-WED,SAT”.

“*” 代表整个时间段.

每一个字段都有一套可以指定有效值,如

Seconds (秒) :可以用数字0-59 表示,

Minutes(分) :可以用数字0-59 表示,

Hours(时) :可以用数字0-23表示,

Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份

Month(月) :可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示

Day-of-Week(每周):可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示

“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行

“?”:表示每月的某一天,或第周的某一天

“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”

“W”:表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”

““#”:是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为”6#3” or “FRI#3” 则表示“每月第三个星期五”

1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

           字段名                 允许的值                        允许的特殊字符  
           秒                      0-59                           , - * /  
           分                      0-59                           , - * /  
           小时                    0-23                           , - * /  
           日                      1-31                         , - * ? / L W C  
           月                  1-12 or JAN-DEC                    , - * /  
           周几                 1-7 or SUN-SAT                   , - * ? / L C #  
           年 (可选字段)        empty, 1970-2099                    , - * /

           “?”字符:表示不确定的值

           “,”字符:指定数个值

           “-”字符:指定一个值的范围

           “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

           “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

           “W”字符:指定离给定日期最近的工作日(周一到周五)

           “#”字符:表示该月第几个周X。6#3表示该月第3个周五

     2)Cron表达式范例:

             每隔5秒执行一次:*/5 * * * * ?

             每隔1分钟执行一次:0 */1 * * * ?

             每天23点执行一次:0 0 23 * * ?

             每天凌晨1点执行一次:0 0 1 * * ?

             每月1号凌晨1点执行一次:0 0 1 1 * ?

             每月最后一天23点执行一次:0 0 23 L * ?

             每周星期天凌晨1点实行一次:0 0 1 ? * L

             在26分、29分、33分执行一次:0 26,29,33 * * * ?

             每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值