Quartz与SpringBoot集成

2 篇文章 1 订阅
2 篇文章 0 订阅

        Quartz是OpenSymphony开源组织在Job scheduling领域的有一个开源项目,是一个任务管理系统,可以与J2EE、J2SE应用程序结合,也可以单独使用,Quartz不仅可以用来创建简单的定时程序,还可以创建可运行成百上千甚至上万个Job的复杂定时程序。

        Quartz框架的核心对象如下:

直接上代码:

方法一:

1、引入依赖包:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2、自定义任务类:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

/**
 * @Description:
 * @Author devin.jiang
 * @CreateDate 2019/5/19 20:22
 */
@Configuration
@Component
@EnableScheduling
public class HelloTask {

    public void sayHello() {
        System.out.println("hello word");
    }

}

3、配置类


import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;

/**
 * @Description: 配置Quartz的Scheduler调度器
 * @Author devin.jiang
 * @CreateDate 2019/5/19 20:10
 */
@Configuration
public class QuartzConfigure {

    /**
     * 使用MethodInvokingJobDetailFactoryBean进行配置,自定义任务不需要实现Job接口
     * @param helloTask
     * @return
     */
    @Bean(name = "jobDetail")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(HelloTask helloTask) {

        MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
        //是否并发执行
        jobDetailFactoryBean.setConcurrent(false);
        //设置需要执行的实体类对应的对象
        jobDetailFactoryBean.setTargetObject(helloTask);
        //设置需要执行的方法
        jobDetailFactoryBean.setTargetMethod("sayHello");

        return jobDetailFactoryBean;

    }

    /**
     * 配置储发器
     * @param jobDetailFactoryBean
     * @return
     */
    @Bean(name = "cronJobTrigger")
    public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetailFactoryBean) {

        CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
        triggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        //设置cron表达式,10秒钟执行一次
        triggerFactoryBean.setCronExpression("*/10 * * * * ?");

        return triggerFactoryBean;

    }

    /**
     * 配置Scheduler
     * @param cronJobTrigger
     * @return
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactoryBean(Trigger cronJobTrigger) {

        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        //用于Quartz集群,QuartzScheduler启动时会更新已存在的Job
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        //延时启动,应用启动1秒后
        schedulerFactoryBean.setStartupDelay(1);
        //注册触发器
        schedulerFactoryBean.setTriggers(cronJobTrigger);

        return schedulerFactoryBean;

    }

}

4、运行截图:

方法二:

1、引入依赖包,如方法一第一步

2、自定义任务类:


import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

/**
 * @Description: 自定义任务类,通过注解实现
 * @Author devin.jiang
 * @CreateDate 2019/5/19 20:08
 */
@Component
public class HelloJob implements Job {

    private String name;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        JobDataMap jdm = jobExecutionContext.getJobDetail().getJobDataMap();
        name = jdm.getString("name");

        System.out.println("hello: " + name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3、配置类:


import org.quartz.JobDataMap;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;

/**
 * @Description: 配置Quartz的Scheduler调度器
 * @Author devin.jiang
 * @CreateDate 2019/5/19 20:10
 */
@Configuration
public class QuartzJobConfigure {

    /**
     * 使用JobDetailFactoryBean进行配置,自定义任务需要实现Job接口
     * @param helloJob
     * @return
     */
    @Bean("jobDetail")
    public JobDetailFactoryBean jobDetailFactoryBean(HelloJob helloJob) {

        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(helloJob.getClass());
        jobDetailFactoryBean.setDurability(true);
        //额外参数
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name","Quartz");
        jobDetailFactoryBean.setJobDataMap(jobDataMap);

        return jobDetailFactoryBean;

    }

    /**
     * 普通的触发器,此处也可用Cron储发器实现
     * @param jobDetail
     * @return
     */
    @Bean("simpleTrigger")
    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetail) {

        SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
        simpleTriggerFactoryBean.setJobDetail(jobDetail.getObject());
        simpleTriggerFactoryBean.setStartDelay(0);
        simpleTriggerFactoryBean.setRepeatInterval(1000);

        return simpleTriggerFactoryBean;

    }

    /**
     * 配置调度容器
     * @param simpleTrigger
     * @return
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactoryBean(Trigger simpleTrigger) {

        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        //用于Quartz集群,QuartzScheduler启动时会更新已存在的Job
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        //延时启动,应用启动1秒后
        schedulerFactoryBean.setStartupDelay(1);
        //注册触发器
        schedulerFactoryBean.setTriggers(simpleTrigger);

        return schedulerFactoryBean;

    }

}

4、运行截图:

代码git地址:https://github.com/380682174/springBootBuket.git

参考:《可伸缩服务架构》

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值