springboot整合quartz
程序员文章站
2022-06-01 13:37:58
...
前言
在上一篇中,我们了解了quartz的基本使用,在项目中与springboot的整合是比较常见的方式,下面让我们来看看如何在springboot中集成quartz吧
1、引入pom
<!--spring boot集成quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2、配置文件无需做太多配置
server.port=8088
3、编写quartz.config类
通过上一篇的quartz的基本使用我们了解到,quartz的运行其实就是3部分,trigger,jobDetail和scheduler,将他们组装起来就可以运行起来
在quartz.config中,trigger和jobDetail以bean的形式注入到spring容器中,然后再通过scheduler的相关API进行调用即可
@Configuration
public class QuartzConfig {
@Bean
public JobDetail myJobDetail(){
JobDetail jobDetail = JobBuilder
.newJob(MyQuartzJob.class)
.withIdentity("myQuartzJob", "group1")
.storeDurably()
.build();
return jobDetail;
}
@Bean
public Trigger myTrigger(){
Trigger trigger = TriggerBuilder.newTrigger()
.startNow()
.withIdentity("myTrigger","group1")
.forJob(myJobDetail())
.withSchedule(
SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()
).build();
return trigger;
}
}
可以发现,其实就是上一篇中的代码抽取
4、编写一scheduler的调度类
该类提供一些常用的方法,比如启动任务,暂停任务,恢复任务等操作
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyQuartzScheduler {
// 任务调度
@Autowired
private Scheduler scheduler;
/**
* 开始执行所有任务
*
* @throws SchedulerException
*/
public void startJob() throws SchedulerException {
scheduler.start();
}
}
5、提供一个监听器的类,用于项目启动时候调取任务
import com.congge.scheduler.MyQuartzScheduler;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
@Configuration
@Slf4j
public class DoJobScheduler implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private MyQuartzScheduler myQuartzScheduler;
@SneakyThrows
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
myQuartzScheduler.startJob();
System.out.println("任务启动...");
}
/**
* 注入scheduler
*
* @return
* @throws SchedulerException
*/
@Bean
public Scheduler scheduler() throws SchedulerException {
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}
最后别忘了最基本的job类,
@Slf4j
public class MyQuartzJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
LocalTime now = LocalTime.now();
log.info(now.toString() + ":开始执行job");
}
}
启动项目,观察控制台效果,到这里,我们的整合就基本完成了
最后要说一个问题就是,在实际开发中,由于quartz不是分布式任务调度框架,因此如果是分布式部署的话,最最好配置分布式锁一起使用,小编在项目中配合zookeeper锁一起使用
坑点
在trigger的配置的地方一定要加上下面这句,否则会下面这个错
关于springboot和quartz的整合,网上的可参考的资料提到的整合方式有很多,也比较灵活,大家找一种适合自己的比较简单的方式即可,本篇到此结束,最后感谢观看!
上一篇: 苹果宣布iOS 14重大更新:强制启用隐私追踪防护
下一篇: 她是是副军级的爱国志士,丈夫是国防部长