Quartz入门实例Spring对Quartz的支持示例

入门简介:

基本上任何公司都会用到调度这个功能,比如博客什么的定时更新之类的,都可以靠Quartz来完成。正如官网所说,小到独立应用大到大型电子商务网站, Quartz都能胜任。

费话不多说,我们先来个实战先:

1.建个Web工程先

2.加入相关jar
log4j-1.2.14.jar
quartz-all-1.8.6.jar
slf4j-api-1.6.0.jar
slf4j-log4j12-1.6.0.jar
jar的版本看个人而定

3.新建一个任务类RemindJob 它要实现Job接口

package com.jbit.service;//林

import java.util.Date;

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

public class RemindJob implements Job {
    /**
     * 用于进行任务动作
     */
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println(new Date()+"我可以进行任务动作了:"+"JobDetailName为"+context.getJobDetail().getName()+"\t TriggerName为"+context.getTrigger().getName());
        //打印封装的信息
        JobDataMap dataMap=context.getJobDetail().getJobDataMap();
        System.out.println("dataMap:"+dataMap.get("user"));
    }
}

4.新建一个测试类 测试 simpleTrigger的任务触发器

package com.jbit.service;//林

import java.text.ParseException;
import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

public class TestSimpleTrigger  {
    /***
     * simpleTrigger固定时间间隔调度(例如每隔3秒执行一次)
     * 
     * @param args
     */
    public static void main(String[] args) {
        // 创建一个任务(参数1.任务名称 2.任务所在组件 3.要执行的任务类)
        JobDetail job = new JobDetail("任务名称", "任务所在组件1", RemindJob.class);
        //初始化数据,进行封装,可以在任务类中使用
        JobDataMap dataMap = job.getJobDataMap();
        dataMap.put("user", "张三");
        // 创建一个触发器(参数1.这是触发器的名字 2.重复次数 3.间隔时间)
        SimpleTrigger simpleTrigger = new SimpleTrigger("这是触发器的名字", SimpleTrigger.REPEAT_INDEFINITELY, 3000);
        simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 1000));

        // 通过SchedulerFactory创建一个调度者Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler;
        try {
            // 创建一个调度者
            scheduler = schedulerFactory.getScheduler();
            // 注册并进行调度
            scheduler.scheduleJob(job, simpleTrigger);
            // 启动调度
            scheduler.start();
            // 线程休眠10分,方便我们观察效果
            Thread.sleep(300 * 1000);// 线程
            // 关闭
            scheduler.shutdown();
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

5.到这里simpleTrigger的任务触发器是可以运行的了
下面的是 CronTrigger 任务触发器 任务类我就不多写了,用同一个


package com.jbit.service;//林

import java.text.ParseException;
import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

public class TestCronTrigger {
    /***
     * simpleTrigger固定时间间隔调度(例如每隔3秒执行一次)
     * 
     * @param args
     */
    public static void main(String[] args) {
        JobDetail job = new JobDetail("任务名称", "任务所在组件1", RemindJob.class);
        JobDataMap dataMap = job.getJobDataMap();
        dataMap.put("user", "张三");
        // 创建一个触发器(参数1.这是触发器的名字 2.重复次数 3.间隔时间)
        CronTrigger cronTrigger = null;
        // 通过SchedulerFactory创建一个调度者Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler;
        try {
            cronTrigger = new CronTrigger("这是触发器的名字", "10", "0/10 * * * * ?");
            // 创建一个调度者
            scheduler = schedulerFactory.getScheduler();
            // 注册并进行调度
            scheduler.scheduleJob(job, cronTrigger);
            // 启动调度
            scheduler.start();
            // 线程休眠10分,方便我们观察效果
            Thread.sleep(300 * 1000);
            // 关闭
            scheduler.shutdown();
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
注意:
  1. Job: 是一个接口,只定义一个方法execute(JobExecutionContext context),在实现接口的execute方法中编写所需要定时执行的Job(任务), JobExecutionContext类提供了调度应用的一些信息。Job运行时的信息保存在JobDataMap实例中;

  2. JobDetail: Quartz每次调度Job时, 都重新创建一个Job实例, 所以它不直接接受一个Job的实例,相反它接收一个Job实现类(JobDetail:描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息),以便运行时通过newInstance()的反射机制实例化Job。

  3. Trigger: 是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的15:00~16:00执行调度等;

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

“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后 一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五

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 * * ?

还有就是spring也有对Quartz的支持

下面我们来个简单的实例

1.我们准备相关的spring.jar与Quartz的jar

2.我还是用到上面的Web项目

3.要有一个任务类,我就不新建了 还是用上面的已有的 RemindJob 任务类

4.对spring的配置文件 applicationContext.xml 进行配置


<?xml version="1.0" encoding="UTF-8"?>
<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
    <!-- 配置任务 -->
    <bean id="jobD"
        class="org.springframework.scheduling.quartz.JobDetailBean">
        <!-- 指定做任务的类 -->
        <property name="jobClass" value="com.jbit.service.RemindJob" />
        <!-- 指定任务数据  -->
        <property name="jobDataAsMap">
            <map>
                <entry key="user" value="小孩" />
            </map>
        </property>
    </bean>
    <!-- 配置间隔触发器1 -->
    <bean id="simpleTrigger"
        class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <!-- 绑定任务 -->
        <property name="jobDetail" ref="jobD" />
        <!-- 启动后延迟时间1s -->
        <property name="startDelay" value="1000" />
        <!-- 定义规则间隔时间3s -->
        <property name="repeatInterval" value="3000" />
    </bean>


    <!-- 配置指定时间点调度(例如每天的一点钟执行一次)触发器2 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <!-- 绑定任务 -->
    <property name="jobDetail" ref="jobD" />
    <!-- 定义规则 每到为10的倍数秒时进行-->
    <property name="cronExpression" value="0/10 * * * * ?" />
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!--可以进行多个触发器的设置
                 <ref bean="simpleTrigger" /> -->
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>
</beans>

5.到这里spring与quartz的整合差不多完成了只要加载spring的配置文件就行了



package com.jbit.service;//林

import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring_Quartz {
public static void main(String[] args) {
        new ClassPathXmlApplicationContext("applicationContext.xml");

    }
}

6.运行TestSpring_Quartz 得到的结果和用代码的是一样的、

学到这里的你差不多对Quartz有一定的了解了,如果你想更深入,就得去找相关的文档去多看看,多去实践一下
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值