Quartz学习——Quartz简单入门Demo(二)

下面介绍Quartz入门的示例,项目地址: quartz-demo
由于Quartz的存储方式分为RAM和JDBC,分别对这两种进行简单的说明。并附上代码!
首先需要添加Quartz的依赖 ,我使用的是quartz.2.2.3版本!

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.3</version>
</dependency>

RAM方式

要测试RAMdemo的代码,请先删除demo中这个quartz.properties文件,或者重命名!否则会测试不成功!
(1):Job

package com.wyj.exampleRAM;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * RAMjob
 * 
 * 
 * @author:WangYuanJun
 * @date:2017年12月28日 下午10:03:31
 */
public class RAMJob implements Job{

    private Logger logger = LoggerFactory.getLogger(RAMJob.class);

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        logger.debug("hello world ! hello Quartz - "+new Date());
    }

}

(2):JobTest

package com.wyj.exampleRAM;

import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * RAMtest
 * 
 * 
 * @author:WangYuanJun
 * @date:2017年12月28日 下午10:03:50
 */
public class RAMQuartzTest {

    private static Logger logger = LoggerFactory.getLogger(RAMJob.class);

    public static void main(String[] args) throws SchedulerException {
        //1.创建Scheduler的工厂
        SchedulerFactory sf = new StdSchedulerFactory();

        //2.从工厂中获取调度器实例
        Scheduler scheduler = sf.getScheduler();

        //3.创建JobDetail
        JobDetail jb = JobBuilder.newJob(RAMJob.class)
                .withDescription("this is hello job")//job的描述
                .withIdentity("helloJob", "helloGroup")//job 的name和group
                .build();

         //任务运行的时间,SimpleSchedle类型触发器有效
        long time=  System.currentTimeMillis() + 3*1000L; //3秒后启动任务
        Date statTime = new Date(time);
        //4.创建Trigger
        //使用SimpleScheduleBuilder或者CronScheduleBuilder
        Trigger trigger = TriggerBuilder.newTrigger()
                            .withDescription("")
                            .withIdentity("helloTrigger", "helloTriggerGroup")
                            .startAt(statTime)//默认当前时间启动
                            .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))//两秒执行一次
                            .build();

        //5.注册任务和定时器
        scheduler.scheduleJob(jb, trigger);

        //6.启动 调度器
        scheduler.start();
        logger.debug("启动时间 :"+new Date());
    }
}

运行结果:
SimpleScheduleBuilder:
这里写图片描述
CronScheduleBuilder:
这里写图片描述

JDBC方式

使用jdbc方式,就要配置quartz.properties文件,并且在开始的时候在数据库中新增表!
我使用的数据库是mysql,数据库中表在wyj-quartz-demo项目里面有,需要的请在里面下载!
运行 tables_mysql.sql 这个文件。

#配置数据源属性  
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://192.168.99.100:3306/quartz_test?useUnicode=true&characterEncoding=utf-8
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:admin
org.quartz.dataSource.qzDS.maxConnections:10

(1)job

package com.wyj.exampleJDBC;

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

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * JdbcJob
 * 
 * 
 * @author:WangYuanJun
 * @date:2017年12月28日 下午10:04:03
 */
public class JdbcJob implements Job{

    private Logger logger = LoggerFactory.getLogger(JdbcJob.class);

    public void execute(JobExecutionContext arg0) throws JobExecutionException {

        logger.debug("MyJDBCJob is start ...");

        logger.debug("MyJDBCJob quzrtz "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));

        logger.debug("MyJDBCJob is end ...");
    }
}

(2)jobTest

package com.wyj.exampleJDBC;

import java.util.List;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
 * JdbcJobtest
 * 
 * 
 * @author:WangYuanJun
 * @date:2017年12月28日 下午10:04:14
 */
public class QuartzJdbcTest {

    public static void main(String[] args) {
        testStartSchedule();
//        resumeJob();
    }


    /**
     *  开始一个simpleSchedule()调度
     */
    public static void testStartSchedule(){

        try {
            // 1、创建一个JobDetail实例,指定Quartz
            JobDetail jobDetail = JobBuilder.newJob(JdbcJob.class)
                    // 任务执行类
                    .withIdentity("job_1", "jGroup1")// 任务名,任务组
                    .build();
            //触发器类型
//          SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForTotalCount(5); // 设置执行次数

            CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
            //  2、创建Trigger

            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger_1","triggerGroup1")
                    .withSchedule(builder)
                    .build();

            // 3、创建Scheduler
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            // 4、调度执行
            scheduler.scheduleJob(jobDetail,trigger);

            try {
                Thread.sleep(60000);
            } catch (Exception e) {
                e.printStackTrace();
            }

            //关闭调度器
            scheduler.shutdown();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从数据库中找到已经存在的job,并重新开户调度
     */
    public static void resumeJob(){
        try {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            JobKey jobKey = new JobKey("job1_1", "jGroup1");
            List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
            //SELECT TRIGGER_NAME, TRIGGER_GROUP FROM {0}TRIGGERS WHERE SCHED_NAME = {1} AND JOB_NAME = ? AND JOB_GROUP = ?
            // 重新恢复在jGroup1组中,名为job1_1的 job的触发器运行
            if(triggers.size() > 0){
                for (Trigger tg : triggers) {
                    // 根据类型判断
                    if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) {
                        // 恢复job运行
                        scheduler.resumeJob(jobKey);
                    }
                }
                scheduler.start();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:
数据库信息:
这里写图片描述

控制台信息:
这里写图片描述

注意:Cron和Simple类型,Simple类型的如果JobDetail没有设置.storeDurably(true),则job在运行完成之后会在数据库中删除!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值