Spring集成Quartz的3种方式

1.使用xml配置方式

Maven依赖

    <properties>
        <!-- spring版本号 -->
        <spring.version>4.2.2.RELEASE</spring.version>                      <!-- Quartz的版本 -->
    </properties>
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.2</version>
        </dependency>

application.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置Job类 -->
    <bean id="myJob" class="cn.enjoyedu.quartz.xml.CronJob"></bean>

    <!-- 配置JobDetail -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 执行目标job -->
        <property name="targetObject" ref="myJob"></property>

        <!-- 要执行的方法 -->
        <property name="targetMethod" value="execute"></property>
    </bean>

    <!-- 配置tirgger触发器 -->
    <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- jobDetail -->
        <property name="jobDetail" ref="jobDetail"></property>

        <!-- cron表达式,执行时间  每5秒执行一次 -->
        <property name="cronExpression" value="0/5 * * * * ?"></property>
    </bean>

    <!-- 配置调度工厂 -->
    <bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTriggerFactoryBean"></ref>
            </list>
        </property>

    </bean>

    <!--<bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">-->
        <!--&lt;!&ndash;配置具体要执行的jobDetail&ndash;&gt;-->
        <!--<property name="jobDetail" ref="simpleJobDetail" />-->
        <!--&lt;!&ndash;初始延迟时间 1s&ndash;&gt;-->
        <!--<property name="startDelay" value="1000" />-->
        <!--&lt;!&ndash;间隔执行时间每2s执行一次&ndash;&gt;-->
        <!--<property name="repeatInterval" value="2000" />-->
    <!--</bean>-->
</beans>

Job类

package cn.enjoyedu.quartz.xml;

public class CronJob {
    public void execute(){
        System.out.println("定时任务执行...每5秒执行一次");
    }
}

测试类

package cn.enjoyedu.quartz.xml;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringQuartzXmlTest {
    public static void main(String[] args) {
        //启动spring容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
        System.out.println("initContext successfully");
    }
}

执行结果

initContext successfully
定时任务执行...每5秒执行一次
定时任务执行...每5秒执行一次

2.注解方式

application.xml

    <!-- 开启组件扫描 -->
    <context:component-scan base-package="cn.enjoyedu.quartz.annotation"></context:component-scan>
    <!-- 开启定时任务,spring的定时任务。不是原生quartz -->
    <task:annotation-driven/>

Job class

package cn.enjoyedu.quartz.annotation;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class AnnotationJob {
    @Scheduled(cron = "0/5 * * * * ?")
    public void excute(){
        System.out.println("AnnotationJob 执行 5秒1次");
    }
}

执行结果

initContext successfully
AnnotationJob 执行 5秒1次
AnnotationJob 执行 5秒1次

3.支持数据库配置cron表达式

3.1TimetaskController

@RequestMapping(value = "/initJob", method = RequestMethod.POST)
    @ResponseBody
    public String initJob() {
        try {
            ObjectResult result = timetaskBiz.initJob();
            return JSONHelper.toJsonDataAPI(result, result.getApiStatus(), result.getErrorMsg());
        } catch (Exception e) {
            return JSONHelper.toJsonErrorDataAPI(e);
        }
    }

3.2 初始化job和启动job

    /**
     * 初始化job
     * @param timetask
     */
    @Override
    public ObjectResult initJob() {
        ObjectResult result = new ObjectResult();
        try {
            Scheduler scheduler = factoryBean.getScheduler();
            //这里从数据库中获取任务信息数据
            Timetask timetask = new Timetask();
            //0 表示定时任务停止中  1 表示定时任务执行中
            timetask.setJobStatus("0");
            //从数据库中查询定时印务记录。
            List<Timetask> timetaskList =  this.getTimetaskListCus(timetask).getListTimetask();
            for (Timetask task : timetaskList) {
                addJob(task);
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            result.setErrorMsg(e.getMessage());
            result.setApiStatus(ApiData.STATUS_EXCEPTION);
        }
        return result;
    }

     /**
     * 添加job
     * @param timetask
     */
    private void addJob(Timetask timetask) {
        if(timetask == null || (timetask.getJobStatus() == ScheduleJob.STATUS_RUNNING)) {
            return;
        }

        try {
            Scheduler scheduler = factoryBean.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(timetask.getName(),timetask.getGroupName());
            CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            //如果不存在cronTrigger则重新创建一个
            if(null == cronTrigger){
                Class clazz = null;
                try {
                    clazz = Class.forName(timetask.getBeanClass());
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                JobDetail  jobDetail = JobBuilder.newJob(clazz)
                        .withIdentity(timetask.getName(),timetask.getGroupName())
                        .usingJobData("data","")
                        .build();
                jobDetail.getJobDataMap().put("scheduleJob",timetask);
                CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(timetask.getCron());
                cronTrigger = TriggerBuilder.newTrigger().withDescription(timetask.getIdStr())
                        .withIdentity(timetask.getName(),timetask.getGroupName())
                        .withSchedule(cronScheduleBuilder)
                        .build();

                scheduler.scheduleJob(jobDetail,cronTrigger);
            } else {

                CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(timetask.getCron());
                //TODO usingJobData的参数
                cronTrigger = cronTrigger.getTriggerBuilder().withIdentity(triggerKey).usingJobData("data","")
                        .withSchedule(cronScheduleBuilder).build();
                scheduler.rescheduleJob(triggerKey,cronTrigger);
            }
            //执行
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

3.3 job类

package com.zt.uni.api.task.jobs;

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

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("MyJob ... execute ...");
    }
}

package com.zt.uni.api.task.jobs;

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

public class MyJob2 implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("MyJob2 ... execute ...");
    }
}

3.4 数据库配置

3.5 执行结果

MyJob ... execute ...
MyJob2 ... execute ...
MyJob ... execute ...
MyJob ... execute ...
MyJob2 ... execute ...
MyJob ... execute ...
MyJob ... execute ...

3.6 存在的问题(最近工作忙,后面再补回来)

  • 如果要支持定时任务可以拔插式使用
  • 要支持图形界面配置
  • 要支持定时任务在某个时间段期间执行[start_time ,end_time]执行
  • 要支持记录定时任务的异常信息

原文地址:https://www.cnblogs.com/codetree/p/9899077.html

时间: 2024-11-07 06:00:08

Spring集成Quartz的3种方式的相关文章

Spring 集成Hibernate的三种方式

首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 第一种集成方式:首先定义一个MySessionFactory的类 package com.tz.core; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.springfr

使用Spring集成Quartz

Quartz: Quartz调度包的两个基本单元是作业(Job)和触发器(Trigger).作业是能够调度的可执行任务,触发器提供了对作业的调度.虽然这两个实体很容易合在一起,但在Quartz中将它们分离开来是有原因的,而且也很有益处.通过把要执行的工作与它的调度分开,Quartz允许在不丢失作业本身或作业的上下文的情况下,修改调度触发器.而且,任何单个的作业都可以有多个触发器与其关联 使用Spring集成Quartz: 本系统使用Spring来集成Quartz.我们只需要在Spring中配置相

spring集成quartz

spring集成quartz 注意:出现异常"Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class" Spring3.0不支持Quartz2.0,因为org.quartz.CronTrigger在2.0从class变成

Spring实现AOP的4种方式(转)

转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的

Spring事务配置的五种方式

Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分

SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. Spring依赖注入(

Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪

Spring 配置事物的5种方式

Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分

Spring 使用AspectJ的三种方式

Spring 使用AspectJ 的三种方式 一,使用JavaConfig 二,使用注解隐式配置 三,使用XML 配置 背景知识: 注意 使用AspectJ 的 时候 要导入相应的Jar 包 嗯 昨天还碰到了这样的问题: Caused by: java.lang.IllegalArgumentEx http://pic.cnhubei.com/space.php?uid=1132&do=album&id=814854http://pic.cnhubei.com/space.php?uid=