quartz任务调度整合springMVC学习二

之前写了quartz整合spring的使用的静态调用,但实际工作中可能会需要用到动态的任务调度,不是写死在spring里面,而是可以由管理员配置怎么执行,这里就需要将quartz中trigger 和 job的信息存入数据库持久化,不过在整合springmvc前,我觉得先熟悉quartz的单独使用会更有助于学习,以下以query2.2.2为例,做了一些测试。

1、首先是创建任务调度工厂:

//创建调度器工厂
SchedulerFactory schedulerFactory=new StdSchedulerFactory();

2、从调度器工厂中获取调度器

//从调度工厂中获取调度器
Scheduler scheduler=schedulerFactory.getScheduler();

3、建立工作,两种写法:一种是JobDetailImpl直接实例化一个调用器,参数依次为名称,组,调用方法所在的类(需要实现Job接口),第二种是用JobDetail接口去创建。

//创建一个工作,指向执行的类,这里有必要说明一下,quartz在2.0以后将JobDetail改成了接口,我之前测试的时候直接用JobDetail去建实例一直报错,原因就是用了2.0以后的包
//JobDetailImpl job=new JobDetailImpl("jobName","jobGroup",SimpleJob.class);
JobDetail job=JobBuilder.newJob(SimpleJob.class).withIdentity("jobName","jobGroup").build();
//这样建立的工作只会去调用类里面默认的execute方法,如果想要动态的去调用,可以通过JobDataMap去传一些参数,JobDataMap跟map用法差不多,把想传的参数put进去就行,我在SimpleJob类里面写了一个反射,动态的去调用方法,当然也可以用if else的形式选择去执行那个方法,放射的写法如下:
String str=Job.getJobDetail().getJobDataMap().getString("method");
this.getClass().getMethod(str).invoke(null,null);
//SimpleJob.class.getMethod(str).invoke(null,null);都一样

4、创建触发器,分为简单的触发器和定时的触发器,同样各有两种写法

简单触发器一:
//SimpleTriggerImpl simpleTrigger=new SimpleTriggerImpl("spt");
//simpleTrigger.setStartTime(new Date());
//simpleTrigger.setRepeatInterval(6000);
//simpleTrigger.setRepeatCount(5);
简单触发器二:
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup") .withSchedule(
SimpleScheduleBuilder.repeatSecondlyForever()).startAt(new Date()).build();                    // 执行规则此处为每秒重复永久执行        执行时间(startAt可自定义启动时间)  
定时触发器一:
//CronTriggerImpl cronTriggerImpl=new CronTriggerImpl("crt1");
//cronTriggerImpl.setStartTime(new Date());
//cronTriggerImpl.setCronExpression("0/10 * * * * ? ");
定时触发器二:
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup").withSchedule(
CronScheduleBuilder.cronSchedule("0 42 10 * * ? *")).startNow().build();  
       //执行规则 表达式参照一里面的规则            执行时间(startNow为立即启动)
 //关于这边的执行规则的方法可以网上找一个quartz的说明文档

5、将工作与触发器放入调度器

//有多个工作,可以添加多个进去
scheduler.scheduleJob(job, trigger);
//scheduler.scheduleJob(job2, trigger2);添加工作

//创建key JobKey key=new JobKey("jobName","jobGroup"); 

//scheduler.deleteJob(key);删除任务
//scheduler.pauseJob(key);暂停任务
//开始执行
scheduler.start();

然后在贴上一个写好的util类

public class JobUtil {
    private final static Logger logger = LogManager.getLogger();
    /**
     * 获取JobKey
     * @param job
     * @return
     */
    public static JobKey getJobKey(QuartzJob job){
        return JobKey.jobKey(job.getJobName(), job.getJobGroup());
    }
    /**
     * 获取TriggerKey
     * @param job
     * @return
     */
    public static TriggerKey getTriggerKey(QuartzJob job){
        return TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
    }
    /**
     * 获取CronTrigger
     * @param scheduler
     * @param job
     * @return
     */
    public static CronTrigger getCronTrigger(Scheduler scheduler, QuartzJob job){
        try {
            TriggerKey triggerKey = getTriggerKey(job);
            return (CronTrigger) scheduler.getTrigger(triggerKey);
        } catch (SchedulerException e) {
            logger.error(e);
        }
        return null;
    }
    /**
     * 新增Job
     * @param scheduler
     * @param job
     * @throws ClassNotFoundException
     */
    public static void insertJob(Scheduler scheduler, QuartzJob quartzJob) throws ClassNotFoundException{
        String jobName = quartzJob.getJobName();
        String jogGroup = quartzJob.getJobGroup();
        String cronExpression = quartzJob.getCronExpression();
        Class _class = Class.forName(quartzJob.getJobClassName());
        //构建任务
        JobDetail jobDetail = JobBuilder.newJob(_class).withIdentity(jobName, jogGroup).build();
        //放入参数,在运行时获取
        jobDetail.getJobDataMap().put(Cast.job_params, quartzJob);
        //构建调度表达式
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
        //构建trigger
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, jogGroup)
                .withSchedule(cronScheduleBuilder).build();
        try {
            //构建job
            scheduler.scheduleJob(jobDetail, cronTrigger);
        } catch (SchedulerException e) {
            //日志记录
            logger.error(e);
        }
    }
    /**
     * 运行一次
     * @param scheduler
     * @param job
     * @throws SchedulerException
     */
    public static void runJob(Scheduler scheduler, QuartzJob job) throws SchedulerException{
        JobKey jobKey = getJobKey(job);
        scheduler.triggerJob(jobKey);
    }
    /**
     * 更新定时任务
     * @param scheduler
     * @param job
     */
    public static void updateJob(Scheduler scheduler, QuartzJob job){
        try {
            TriggerKey triggerKey = getTriggerKey(job);
            String cronExpression = job.getCronExpression();
            //构建调度表达式
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
            CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            //重新构建trigger
            cronTrigger = cronTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
            scheduler.rescheduleJob(triggerKey, cronTrigger);
        } catch (SchedulerException e) {
            logger.error(e);
        }
    }
    /**
     * 删除任务
     * @param scheduler
     * @param job
     */
    public static void deleteJob(Scheduler scheduler, QuartzJob job){
        try {
            JobKey jobKey = getJobKey(job);
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            logger.error(e);
        }
    }
    /**
     * 暂停任务
     * @param scheduler
     * @param job
     */
    public static void pauseJob(Scheduler scheduler, QuartzJob job){
        try {
            JobKey jobKey = getJobKey(job);
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            logger.error(e);
        }
    }
}

大致就这些,下次把quartz整合进springMVC在测试一下

时间: 2024-10-18 03:07:18

quartz任务调度整合springMVC学习二的相关文章

SpringMVC学习(二)——SpringMVC架构及组件

相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗? 这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来说比较容易懂的,下面我会给出SpringMVC的框架结构图,这个图相对来说会更复杂,不过经过我细致入微的讲解,相信大家都可以深入理解. SpringMVC框架结构 SpringMVC框架结构如下图所示: 下面我会对SpringMVC框架结构作细致入微的讲解. 架构流程 用户发送请求至前端控制器Dispat

springMVC学习二 原始springMVC环境搭建

第一步:导入jar包 第二步:配置DispatcherServlet DispatcherServlet本质是一个Servlet,在spring-webmvc包中,在servlet2.5之前  springMVC配置文件的默认命名规则为xxx-serlvet.xml,xxx是为DispatcherServlet起的servlet的名称,也就是<servlet-name>标签中的值,并且默认情况下,xxx-servlet.xml文件的位置是WEB-INF目录下,不过从servlet2.5之后可以

SpringMVC学习二、入门程序与组件

入门程序 搭建环境 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring.version>

springmvc学习总结(二) -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

@[email protected] 写在最前 之前分享过下面这几篇: mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上)(附demo和搭建过程遇到的问题解决方法) mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下) springmvc学习笔记(一) -- 从零搭建,基础入门 这一篇,在这些练习的基础上,将它们整合在一起! 搭建步骤如下 一.新建maven项目,配置环境,测试是否配置成

【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合

前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybatis的时候有写过一篇,但是仅仅是整合mybatis和spring,所以这篇文章我系统的总结一下spring.mybatis和springmvc三个框架的整合(后面学习到maven时,我会再写一篇使用maven整合的文章,这篇没有用到maven). 1. jar包管理 我之前有写过一篇spring.hi

quartz任务调度学习一

1.实现定时任务的几种方式: crontab 命令 + sql语句 python脚本 + sql语句 spring + JDK Timer spring + Quartz 2.Quartz概述: Quartz是java领域中最著名的定时任务调度工具,具有以下特性: 强大的调度功能 灵活的应用方式 负载均衡 高可用特性 易于spring集成 3.基础概念: Quartz 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任务调度的元数据,

SpringMVC学习笔记(二): 日常使用功能

前提: 1.web.xml 和spring-mvc核心配置如:SpringMVC学习笔记(一): 基础知识中注解实现. 2.类的@RequestMapping(value="/annotationController") 3.spring-mvc 推荐使用注解实现. 一.数据的接收 (一)URL参数数据的接收 1.使用 HttpServletRequest 获取参数 <span style="font-size:18px;"><span style

springMVC学习(3)-springMVC和mybatis整合

一.需求:使用springmvc和mybatis完成商品列表查询. 二.整合思路:springMVC+mybaits的系统架构: 1步):整合dao层 mybatis和spring整合,通过spring管理mapper接口.使用mapper的扫描器自动扫描mapper接口在spring中进行注册. 2步):整合service层 通过spring管理 service接口.使用配置方式将service接口配置在spring配置文件中.实现事务控制. 3步)整合springmvc 由于springmv

SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBatis框架的学习(六)——MyBatis整合Spring.本文我再来讲SpringMVC和MyBatis整合开发的方法,这样的话,Spring.MyBatis和SpringMVC三大框架的整合开发我们就学会了.这里我使用的Spring是Spring4.1.3这个版本(SpringMVC自然也是这个版本),MyBatis是MyBatis3.2.7这个版本. 为了更好的学习SpringMVC和MyBatis整合开发的方法