Quartz自动任务

一、Quartz

通过main方法调用最基础的quartz:

首先取Quartz官网下载jar包,我用的是2.2.3版本的:点击打开链接  ,需要创建俩个类

public class RAMJob implements Job{
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("Say hello to Quartz" + new Date());
    }

}
public class TestTask{
    public static void main(String[] args) throws SchedulerException {
        //1.创建Scheduler的工厂
        SchedulerFactory sf = new StdSchedulerFactory();
        //2.从工厂中获取调度器实例
        Scheduler scheduler = sf.getScheduler();

        //3.创建JobDetail

        JobDetail jobDetail=JobBuilder.newJob(RAMJob.class).withIdentity("ramJob", "ramGroup").build();

        //4.创建触发器
                Trigger trigger =   
            TriggerBuilder.newTrigger()
            .withIdentity("ramTrigger", "ramTriggerGroup")// 触发器名,触发器组
            .startNow()
            .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))// 触发器时间设定
            .build();// 创建Trigger对象
        //5.注册任务和定时器

        scheduler.scheduleJob(jobDetail, trigger);

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

2.但自动任务用到实际web环境时我们就要求他可以随tomcat一起启动(也可以说时随spring一起启动),所以我们要做的时把以上的信息写道xml文件中并通过web.xml调用,需要注意的是quartz2.x以上版本需要spring3.1以上版本才可以(一把心酸泪)

web.xml:

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/quartz.xml</param-value>
</context-param>

quartz.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    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-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<context:property-placeholder location="classpath:info.properties"/>
    <!-- 
        Spring整合Quartz进行配置遵循下面的步骤:
        1:定义工作任务的Job
        2:定义触发器Trigger,并将触发器与工作任务绑定
        3:定义调度器,并将Trigger注册到Scheduler
     -->
    <bean id="Job" class="cn.com.xxx.RAMJob" />
     
     
     
    <!-- 1:定义任务的bean ,这里使用JobDetailFactoryBean,也可以使用MethodInvokingJobDetailFactoryBean ,JobDetailFactoryBean配置类似-->
    <bean name="JobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 指定job的名称 -->
        <property name="name" value="Job"/>
        <!-- 指定job的分组 -->
        <property name="group" value="Group"/>
        <!-- 指定具体的job类 -->
        <property name="targetObject" ref="Job"/>
        <!-- 指定具体的方法 -->
        <property name="targetMethod" value="execute"/>
        <!-- 不要并发执行  -->
        <property name="concurrent" value="false" />
    </bean>
    
    <!-- 2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 指定Trigger的名称 -->
        <property name="name" value="Trigger"/>
        <!-- 指定Trigger的名称 -->
        <property name="group" value="TriggerGroup"/>
        <!-- 指定Tirgger绑定的Job -->
        <property name="jobDetail" ref="JobDetail"/>
        <!-- 指定Cron 的表达式 ,当前是每隔1s运行一次 -->
        <property name="cronExpression" value="${cron}"/>  《可以看到我使用了一个配置文件我用来动态获取properties中cron的值
        
    </bean>


    <!-- 3.定义调度器,并将Trigger注册到调度器中 -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
        <property name="autoStartup" value="true" /><!--自动启动-->
        
    </bean>

</beans>

info.properties:

cron=0/2 * * * * ?

MethodInvokingJobDetailFactoryBean这个类可以设置是否允许并发执行,tragetMethod用于指定需要自动执行的方法名,

但不能用我第一点说的RAMJob 类了,因为execute方法有参数,而这个并不能或着我不知道怎么设参数(网上找了也没有,欢迎大家后续补充)所以需要改RAMJob 代码:

public class RAMJob{
    @Override
    public void execute() {
        System.out.println("Say hello to Quartz" + new Date());
    }
}

然后启动tomcat就发现任务自动开始执行啦。
 

二、SpringBoot整合Quartz

引入依赖

<!-- SpringBoot 整合 Quartz 定时任务 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>

编写任务类

public class TaskJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("自动任务执行中...");
    }
}

编写配置类

@Configuration
public class QuartzConfig {
    private static String JOB_GROUP_NAME="TASK_GROUP";
    private static String TRIGGER_GROUP_NAME="TRIGGER_GROUP";

    @Bean
    public JobDetail testJobDetail(){
        JobDetail jobDetail= JobBuilder.newJob(TaskJob.class)
                .withIdentity("testJobDetail",JOB_GROUP_NAME)
                .storeDurably()
                .build();
        return jobDetail;
    }

    @Bean
    public Trigger taskJobTrigger(){
        CronScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
        Trigger trigger= TriggerBuilder.newTrigger()
                .forJob(testJobDetail())
                .withIdentity("taskJobTrigger",TRIGGER_GROUP_NAME)
                .withSchedule(scheduleBuilder)
                .build();
        return trigger;
    }


}

运行项目后 

使用数据库保存配置信息

Quzrtz存储任务信息有两种方式,使用内存或者使用数据库来存储

采用mysql数据库存储方式,首先到官网下载quartz包(Downloads),然后在docs下找到tables_mysql.sql进行创建,此时数据库会多出11张表

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值