springboot+quartz

pom.xml:

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

配置定时器:
Spring Schedule 这是spring自带的任务框架 优点就是配置简单,依赖少,缺点就是
同一个task,如果前一个还没跑完后面一个就不会触发,不同的task也不能同时运行。因为scheduler的默认线程数为1,配置pool-size为2的话,会导致同一个task前一个还没跑完后面又被触发的问题,不支持集群等:

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * spring自带任务框架,有弊端
 */
@Component
@EnableScheduling //必须加噢
public class SpringScheduleTask {

    /**
     *  每分钟执行一次
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void reptilian(){
        System.out.println("执行调度任务:"+new Date());
    }
}

Quartz 优点太多了,最主要有负载均衡,容错率高等特点,具体可以参考别人的分享
使首先先要创建一个任务调度器,触发器等 代码如下:

package com.ailink.sap.quartz.config;

import com.ailink.sap.quartz.service.OneJob;
import com.ailink.sap.quartz.service.TwoJob;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfig {
    /**
     *  配置任务
     * @param oneJob QuartzTask为需要执行的任务
     * @return MethodInvokingJobDetailFactoryBean
     */
    @Bean(name = "oneDetail")
    public MethodInvokingJobDetailFactoryBean oneDetail(OneJob oneJob) {
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        // 是否并发执行
        jobDetail.setConcurrent(false);
        // 设置任务的名字
        jobDetail.setName("oneJob");
        // 设置任务的分组,在多任务的时候使用
        jobDetail.setGroup("busJobGroup");
        // 需要执行的对象
        jobDetail.setTargetObject(oneJob);
        /*
         * TODO  非常重要
         * 执行QuartzTask类中的需要执行方法
         */
        jobDetail.setTargetMethod("one");
        return jobDetail;
    }

    @Bean(name = "twoDetail")
    public MethodInvokingJobDetailFactoryBean twoDetail(TwoJob twoJob) {
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        // 是否并发执行
        jobDetail.setConcurrent(false);
        // 设置任务的名字
        jobDetail.setName("twoJob");
        // 设置任务的分组,在多任务的时候使用
        jobDetail.setGroup("busJobGroup");
        // 需要执行的对象
        jobDetail.setTargetObject(twoJob);
        /*
         * TODO  非常重要
         * 执行QuartzTask类中的需要执行方法
         */
        jobDetail.setTargetMethod("two");
        return jobDetail;
    }

    /**
     * 定时触发器
     * @param oneDetail 任务
     * @return CronTriggerFactoryBean
     */
    @Bean(name = "oneTrigger")
    public CronTriggerFactoryBean oneTrigger(JobDetail oneDetail){
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
        trigger.setJobDetail(oneDetail);
        //cron表达式,每1秒钟执行一次
        trigger.setCronExpression("0/1 * * * * ?");
        trigger.setName("oneTrigger");
        return trigger;
    }

    @Bean(name = "twoTrigger")
    public CronTriggerFactoryBean twoTrigger(JobDetail twoDetail){
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
        trigger.setJobDetail(twoDetail);
        //cron表达式,每1秒钟执行一次
        trigger.setCronExpression("0/1 * * * * ?");
        trigger.setName("twoTrigger");
        return trigger;
    }

    /**
     * 调度工厂
     * @param oneTrigger 触发器
     * @return SchedulerFactoryBean
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean oneSchedulerFactory(Trigger oneTrigger,Trigger twoTrigger) {
        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
        // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
        factoryBean.setOverwriteExistingJobs(true);
        // 延时启动,应用启动1秒后
        factoryBean.setStartupDelay(1);
        // 注册触发器
        factoryBean.setTriggers(oneTrigger,twoTrigger);
        return factoryBean;
    }
}

创建需要执行的业务逻辑类:

package com.ailink.sap.quartz.service;

public interface OneJob {
    void one();
}



package com.ailink.sap.quartz.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class OneJobImpl implements OneJob {

    @Override
    public void one() {
        log.info("111111111111111111111111111111");
    }
}
发布了31 篇原创文章 · 获赞 5 · 访问量 630

猜你喜欢

转载自blog.csdn.net/qq_37365741/article/details/102947945