Spring Boot快速集成Quartz定时任务框架

Spring Boot快速集成Quartz定时任务框架

第一步:pom.xml加入Quartz依赖

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

这里使用集成好的快速启动器,不需要手动指定版本和像以往一样手动导入

第二步:自定义JOB任务类

继承QuartzJobBean类 或者是 实现Job接口,这两种方式都有一个函数需要我们重写
两种方式没有差别,选择一种即可。
这里使用实现接口的形式。注意这里自定义的类的名称Job与Quartz里面的接口名称Job重名了,IDEA自动帮我们使用了全类名导入。

@Component
public class Job implements org.quartz.Job {

    @Autowired
    TeatSeriver teatSeriver;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("定时任务执行:" + System.currentTimeMillis());
        teatSeriver.t1();
    }
}

在这里调用了Seriver层的方法,下面附上Seriver层的方法:

@Service
public class TeatSeriver {

    public void t1(){
        System.out.println("Seriver类的T1方法被调用!");
    }
}

Seriver层就一个方法t1

第三步:配置Quartz的调度器并注入到IOC中

下面要配置好Quartz的调度器并添加到IOC容器里面去。

//调度器配置类,在IOC容器里面添加一个调度器
@Configuration
public class SchedulerConfig {

    @Autowired
    MyJobFactory myJobFactory;

    @Bean
    public Scheduler scheduler(){
        return schedulerFactoryBean().getScheduler();
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        //设置调度器名字
        schedulerFactoryBean.setSchedulerName("自定义调度器1");
        //设置启动时间 推迟指定秒数后启动
//        schedulerFactoryBean.setStartupDelay(5);
		//设置启动时间 立即启动
        schedulerFactoryBean.start();
        //设置JOB的构造工厂为我们自己定义的工厂
        schedulerFactoryBean.setJobFactory(myJobFactory);
        return schedulerFactoryBean;
    }

}
重点:该处配置类SchedulerConfig注入了一个我们自己定义的类MyJobFactory。
因为Quartz中任务执行时会实例化任务类,而这个实例化是由Quartz进行的。如果不配置,那么任务类中调用Spring Seriver层的方法时会报空指针异常。(Quartz实例化无法注入Spring容器的Bean)。所以我们需要将这个实例化过程让Spring插一手进来,保证Spring的依赖可以成功注入。
@Component
public class MyJobFactory extends AdaptableJobFactory {

    //拿到Spring的构造工厂
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    //解决Job任务类里面自动注入问题
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 使用Spring的构造工厂进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
该类继承AdaptableJobFactory ,重写了Quartz实例化Job任务类的方法createJobInstance。我们在调用了父类方法后,让Spring插了一手进来。这样就解决了问题。

第四步:添加定时任务

接下来是Controller层方法,会添加一个定时任务到调度器里面去。

@RestController
public class HelloController {
    private final static Logger logger = LoggerFactory.getLogger(HelloController.class);
    @Autowired
    Scheduler scheduler;

    @Autowired
    TeatSeriver teatSeriver;

    @RequestMapping("/log")
    public String log(){
        logger.trace("-------------------");

        JobDetail jobDetail = JobBuilder.newJob(Job.class)
                .withIdentity("任务1")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("触发器1")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();

        //加入调度程序
        try {
            scheduler.scheduleJob(jobDetail,trigger);

//            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }


        return "Log OK";
    }


}

至于任务添加后,动态的删除、修改定时任务,下次再写。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值