quartz任务调度入门与spring整合开发

quartz任务调度入门与spring整合开发

1.简介
什么是Quartz呢?

Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。

Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
2.maven依赖项—dependency
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.12</version>
</dependency>
3.入门案例:
3.1 案例一:
    @Test
    public void quartzTest() throws Exception{
        // 定时器对象
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        (---------------) //  在.start()开启之前 不会执行任何任务;
        // 开启定时任务
        scheduler.start();
        // 关闭定时任务
        scheduler.shutdown();
    }
3.2 案例二: SimpleTrigger 使用
必须掌握 JobDetail 和 Trigger 两个对象
Job 工作任务 ,你要做什么
Trigger 执行工作任务 触发条件 , 什么时间执行, 多久执行一次
/**
*创建一个类实现job接口
*/
public class QuartzJob implements Job{
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //定时任务:打印 hello quartz...
        System.out.println("hello quartz...");
    }
}

/**
*  每一秒打印一次 hello quartz...
*/
public class QuartzPrint1 {
    public static void main(String[] args) throws SchedulerException {
            // 1. 定时器对象
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 1.1 定义一个定时对象
            JobDetail job = JobBuilder.newJob(QuartzJob.class)
                    .withIdentity("job1", "group1").build();
            // 1.2 定义触发器
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("tigger1", "group1")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
                    .build();
            scheduler.scheduleJob(job, trigger);
            // 2. 开启定时任务
            scheduler.start();          
    }
}
3.3 案例三: CronTrigger 的使用
public class QuartzPrint2 {
    public static void main(String[] args) throws SchedulerException {
        // 定时器对象
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        // 定义一个工作表
        JobDetail job = JobBuilder.newJob(QuartzJob.class)
                .withIdentity("job1", "group1").build();
        // 定义触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 ? * *")) //触发器表达式
                .build();
        scheduler.scheduleJob(job, trigger);
        // 开启定时任务
        scheduler.start();
    }
}
3.4 quartz框架核心对象
1、scheduler是一个计划调度器容器,容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。
2、JobDetail是一个可执行的工作,它本身可能是有状态的。
3Trigger触发器代表一个调度参数的配置,什么时候去调。
4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一   对儿),就可以伴随容器启动而调度执行了。
5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
3.5 Cron 表达式
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 * * ?

      每天中午12点触发 "0 0 12  *  * ?" 
      每天上午10:15触发"0 15 10 ? * *" 
      每天上午10:15触发"0 15 10 *  *  ?" 
      每天上午10:15触发"0 15 10 *  * ?*" 
      2017年的每天上午10:15触发"0 15 10  *  * ? 2017" 
      在每天下午2点到下午2:59期间的每1分钟触发"0 * 14 * * ?" 
      在每天下午2点到下午2:55期间的每5分钟触发"0 0/5 14 * *?" 
      在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发"0 0/5 14,18 ** ?" 
      在每天下午2点到下午2:05期间的每1分钟触发"0 0-5 14 * *?" 
      每年三月的星期三的下午2:102:44触发"0 10,44 14 ? 3 WED" 
      MON-FRI" 周一至周五的上午10:15触发"0 15 10 ? * 
      每月15日上午10:15触发"0 15 10 15 *?" 
      每月最后一日的上午10:15触发"0 15 10 L * ?" 
      每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L" 
      2002年至2005年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L 2002-2005" 
      每月的第三个星期五上午10:15触发"0 15 10 ? * 6#3" 


更多表达式请使用工具生成:CronExpBuilder-1.0(触发器表达式生成器).jar
如果双击打不开,请参考下方连接:
https://jingyan.baidu.com/article/200957617c3619cb0621b44d.html
4.Spring整合Quartz
4.1 导入依赖
<dependencies>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.1</version>
            <configuration>
                <port>9999</port>
            </configuration>
        </plugin>
    </plugins>
  </build>
4.2 配置 spring web.xml 监听器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <!-- spring配置文件位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- spring核心监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
4.3 配置 Spring applicationContext.xml
<!-- scheduler  -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory" ref="jobFactory" />
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>
 <!-- job -->
    <bean id="helloJob" 
        class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="cn.crystal.quartz.HelloJob" />
    </bean>

 <!-- trigger -->
    <bean id="simpleTrigger" 
        class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="helloJob" />
        <!-- 3秒后第一次执行 -->
        <property name="startDelay" value="3000" />
        <!-- 5秒后重复执行 -->
        <property name="repeatInterval" value="5000" />
    </bean>
 <!-- 扫描包 -->
 <context:component-scan base-package="cn.crystal.quartz.service" />
4.4 编写job程序
//工作任务工厂
@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
    @Autowired
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle)
            throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

// 工作任务:
public class HelloJob implements Job {
    @Autowired
    private HelloService helloService;

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //调用service方法;
        helloService.sayHello();
    }
}
//service方法:
@Service
public class HelloService {
    public void sayHello() {
        System.out.println("hello,quartz spring !!!~~");
    }
}
5.spring 自带定时任务功能!
1.在applicationContext.xml中加约束
        xmlns:task="http://www.springframework.org/schema/task"
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd

2.配置开启定时任务注解 <task:annotation-driven/>

3.编写具体做事情的类及方法
@Component   <context:component-scan base-package="cn.crystal"/>
public class BosTask {
    @Scheduled(cron="*/5 * * * * ?")   //定时器触发器
    public void refresh(){
        System.out.println("定时操作...");
        //此处可以调用Service
    }       
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值