Java基于Quartz的定时任务调度服务(一)

Quartz的基本用法

一 Quartz的简单介绍
  1. Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现,一个优秀的开源调度框架,其特点是:强大的调度能力.灵活的应用方式,分布式和集群的能. 官网:http://www.quartz-scheduler.org

  2. Quartz的核心元素

    1. Scheduler:任务调度器,是实际执行任务调度的控制器
    2. Trigger:触发器,用于定义任务调度的时间规则,有SimpleTrigger,CronTrigger等,其中SimpleTrigger定义时间规则简单的任务,CronTrigger通过设置Cron表达式定义复杂时间规则的任务
    3. JobDetail:用来描述Job实现类及其它相关的静态信息,如Job/Group名字、关联监听器等信息
    4. Job是一个接口,只有一个方法void execute(JobExecutionContext context),自定义任务只需要实现该方法即可
二 简单使用
  1. 新建一个Maven项目,新建完成后,修改pom.xml文件,添加Quartz依赖
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
  1. 新建Job1,Job2两个类,两个类都实现Job接口,并实现executef方法
package quartzDemo.quartz;

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

public class Job1 implements Job {

    public void execute(JobExecutionContext context) throws JobExecutionException {

        JobKey jobKey = context.getJobDetail().getKey();
        System.out.println(
                String.format("%s: JobGroup:%s JobName:%s", DateTimeHelper.Now(), jobKey.getGroup(), jobKey.getName()));

        JobDataMap dataMap = context.getMergedJobDataMap();
//
//      String jobData = dataMap.getString("JobDetailData");
//      String triggerData = dataMap.getString("TriggerData");
//
//      System.out.println(String.format("JobDataMap: jobData:%s triggerData:%s", jobData, triggerData));
    }

}
package quartzDemo.quartz;

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

public class Job2 implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobKey jobKey = context.getJobDetail().getKey();
        System.out.println(
                String.format("%s: JobGroup:%s JobName:%s", DateTimeHelper.Now(), jobKey.getGroup(), jobKey.getName()));

    }

}
  1. 在App.java中新建两个方法,分别初始化job1和job2,并且在main方法中将两个job添加到Scheduler,如下
package quartzDemo.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author QIUYANJUN
 */
public class App {
    public static void main(String[] args) {

        String job2cronExpression = "0/5 * * * * ? ";
        JobModel job1 = InitSimpleJob();
        JobModel job2 = InitCronJob(job2cronExpression);

        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler;
        try {
            scheduler = factory.getScheduler();
            scheduler.start();
            scheduler.scheduleJob(job1.getJobDetail(), job1.getTrigger());
            scheduler.scheduleJob(job2.getJobDetail(), job2.getTrigger());
            System.out.println(DateTimeHelper.Now());
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * SimpleJob初始化
     * @return
     */
    private static JobModel InitSimpleJob() {
        JobKey jobKey = JobKey.jobKey("job1", "group1");
        JobDetail jobDetail = JobBuilder.newJob(Job1.class).withIdentity(jobKey).withDescription("first quartz job")
                .usingJobData("JobDetailData", "Hello JobDetail").build();

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                .withDescription("first quartz trigger").usingJobData("TriggerData", "Hello Trigger").startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(3))
                .build();

        return new JobModel(jobDetail, trigger);
    }

    /**
     * CronJob初始化
     * 
     * @param cronExpression Cron表达式
     * @return
     */
    private static JobModel InitCronJob(String cronExpression) {

        JobKey jobKey = JobKey.jobKey("job2", "group1");
        JobDetail jobDetail = JobBuilder.newJob(Job2.class).withIdentity(jobKey).withDescription("second quartz job")
                .usingJobData("JobDetailData", "Hello JobDetail").build();

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1")
                .withDescription("second quartz trigger").usingJobData("TriggerData", "Hello Trigger").startNow()
                // .endAt(DateTimeHelper.AddSecond(50))
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();

        return new JobModel(jobDetail, trigger);
    }
}
  1. 其他需要用到的类
package quartzDemo.quartz;

import org.quartz.JobDetail;
import org.quartz.Trigger;

public class JobModel {

    private JobDetail jobDetail;

    private Trigger trigger;

    public JobDetail getJobDetail() {
        return jobDetail;
    }

    public void setJobDetail(JobDetail jobDetail) {
        this.jobDetail = jobDetail;
    }

    public Trigger getTrigger() {
        return trigger;
    }

    public void setTrigger(Trigger trigger) {
        this.trigger = trigger;
    }

    public JobModel() {
    }

    public JobModel(JobDetail jobDetail, Trigger trigger) {
        super();
        this.jobDetail = jobDetail;
        this.trigger = trigger;
    }
}
package quartzDemo.quartz;

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

public class DateTimeHelper {

    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");

    public static String Now() {
        Date date = new Date();
        return simpleDateFormat.format(date);
    }

    public static Date AddSecond(int second) {
        Date date = new Date();
        date.setTime(date.getTime() + second * 1000);
        return date;
    }

    public static String Format(Date date, String pattern) {
        if (!pattern.isEmpty()) {
            pattern = "yyyy-MM-dd HH:MM:ss";
        }
        simpleDateFormat = new SimpleDateFormat(pattern);
        return simpleDateFormat.format(date);
    }
}
  1. 最后,运行App.java中的mian方法,查看输出,如下
    284679-20180903150739118-1552721934.png

转载于:https://www.cnblogs.com/ShuiMu/articles/9578631.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值