quartz整合springboot 基于内存方式以及基于持久化方式都有

开头

springboot本身就自带了一个定时任务,只需要加两个注解即完事,但是不知是我能力原因还是本身框架就是如此,我不知如何暂停springboot自带的定时任务。但是quartz可以暂停,它十分灵活,甚至可以将任务与调度器存进数据库中,灵活配置。该篇博客直接讲述quartz如何整合springboot,但是我推荐大家整合前还是先了解一下quartz原本如何使用,以及quartz如何整合ssm,不然初学者直接quartz整合springboot将会难以理解job与trigger的概念已经之间的关联。如果想要学习quartz以及quartz整合ssm(包括持久化配置)可以看我的quartz笔记

maven依赖

顺便一提,quartz整合springboot有两种方式,一种是ssm如何整合,springboot就如何整合,另一种是使用spring-boot-starter-quartz的方式。
毕竟spring-boot-starter-quartz是springboot的亲儿子,所以该篇博客使用第二种的整合方式
maven坐标

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

创建一个任务类

/**
 * @Author VULCAN
 * @create 2020/3/12 16:10
 */
@DisallowConcurrentExecution //如果不想使用并发的方式执行,可以添加这个注解
public class RealJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("我是正统的springboot——quartz整合方式");
    }
}

其实这个类也可以继承 Job 当配置完成运行的时候,并没有影响。

基于内存的配置

创建一个配置类
/**
 * @Author VULCAN
 * @create 2020/3/12 16:13
 */
@Configuration
public class RealQuartzConfig {

    @Bean //job配置
    JobDetailFactoryBean jobDetailFactoryBean(){
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(RealJob.class);
        return jobDetailFactoryBean;
    }


    @Bean  //调度器配置
    CronTriggerFactoryBean cronTriggerFactoryBean(){
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean().getObject());
        cronTriggerFactoryBean.setCronExpression("0/2 * * * * ?");
        return cronTriggerFactoryBean;
    }

    @Bean  //中心配置
    SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setTriggers(cronTriggerFactoryBean().getObject()); 
        return schedulerFactoryBean;
    }

    @Bean(name="Scheduler")  //获得可以操作定时任务的对象
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

结果如下

每两秒执行一次
在这里插入图片描述

持久化配置

持久化配置就是将job与trigger扔给数据库去存储,不再放入内存中。持久化配置后如果想要修改配置,既可以通过修改数据表中的数据就可以实现不同的效果,十分的灵活,也支持动态的添加修改job与trigger。

maven依赖

因为是基于数据库配置的,所以还需要再添加两个依赖

 		<!-- druid数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
         <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
创建配置类

持久化配置不需要配置任务job与调度器trigger,因为这些都是写在数据库表中的。

/**
 * @Author VULCAN
 * @create 2020/3/12 16:13
 */
@Configuration
public class RealQuartzConfig {
    @Bean  //中心配置
    SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setDataSource(datasource());
        return schedulerFactoryBean;
    }

    @Bean(name="Scheduler")  //获得可以操作定时任务的对象
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }

    @Bean //数据库连接池
    public DruidDataSource datasource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8&useSSL=false\n");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setMaxActive(20);
        druidDataSource.setMaxWait(6000);
        druidDataSource.setInitialSize(1);
        return druidDataSource;
    }
}

添加一个任务与触发器进数据库表中
@SpringBootTest
class QuartzbybootApplicationTests {
    @Autowired
    @Qualifier("Scheduler")
    private Scheduler scheduler;
	@Test
    public void addJob() throws SchedulerException, InterruptedException {

        //创建JobDetail实例
        JobDetail jobDetail = JobBuilder.newJob(RealJob.class)
                .withIdentity("job-boot", "job-boot-group").storeDurably(true).build();
        //创建Trigger实例   每5秒执行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger-boot", "triggerGroup-boot")
                .withSchedule(CronScheduleBuilder.cronSchedule("5/5 * * * * ?")).build();
        //执行
        scheduler.scheduleJob(jobDetail, trigger);//绑定   如果配置了持久化,那这个就是将任务与调度器添加进数据表中
        Thread.sleep(20000); //线程睡眠,以看到添加后的结果
    }
}
添加后结果如下

在这里插入图片描述

表数据如下

qrtz_cron_triggers
在这里插入图片描述
qrtz_job_details
在这里插入图片描述
qrtz_triggers
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以参考以下代码: 首先,需要在pom.xml文件中添加quartzspring-boot-starter-quartz的依赖: ``` <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 然后,创建一个Job类,例如: ``` public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job executed at " + new Date()); } } ``` 接着,创建一个JobDetail和Trigger,将它们注册到Scheduler中: ``` @Configuration public class QuartzConfig { @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("myJob") .storeDurably() .build(); } @Bean public Trigger myTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myTrigger") .withSchedule(scheduleBuilder) .build(); } @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setAutoStartup(true); schedulerFactoryBean.setJobDetails(myJobDetail()); schedulerFactoryBean.setTriggers(myTrigger()); return schedulerFactoryBean; } } ``` 最后,启动程序即可看到定时任务每隔10秒输出一次信息: ``` Job executed at Wed May 13 10:07:30 CST 2020 Job executed at Wed May 13 10:07:40 CST 2020 Job executed at Wed May 13 10:07:50 CST 2020 ... ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值