spring Boot定时任务

spring Boot定时任务,第1张

一,scheduled 定时任务器 scheduled定时任务是spring 3.0以后自带的定时任务器。 如何使用:

1,创建项目导入以下依赖


    org.springframework.boot
    spring-boot-starter-web
    2.6.1



    org.springframework
    spring-context-support

2,写任务通过@Scheduled(cron = " ")中的cron来规定我们job什么时候执行。示例如下,还需要我们在主启动类上加@EnableScheduling

/**
 * 示例
 */
@Component
public class ScheduledDemo {

    /**
     * 定时的job,每三秒执行一次
     * 7位: 秒 分 时 日 月 星期 年
     * 6位: 秒 分 时 日 月 星期
     */
    @Scheduled(cron="0/3 * * * * ?")
    public void spring3ScheduledTest() {
        System.out.println("执行scheduled定时任务时间:"+ new Date());
    }
}

二,整合Quartz 定时任务框架

1,需要导入依赖如下:

        
            org.quartz-scheduler
            quartz
            2.2.1
        

        
            org.springframework
            spring-context-support
        

        
            org.springframework
            spring-tx
        

2,创建定时job的内容示列如下:

public class SpringbootQuartzJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("整合任务开始,时间是:"+ new Date());
    }
}

3,创建配置类(不要缺少@Configuration和@Bean注解),主要是是Quartz的JobDetailFactoryBean、SimpleTriggerFactoryBean(CronTriggerFactoryBean)、SchedulerFactoryBean三个对象。


/**
 * @author ysy
 * 创建我们的JobDetailFactoryBean、SimpleTriggerFactoryBean(CronTriggerFactoryBean)、SchedulerFactoryBean对象
 */
@Configuration
public class ConfigQuartzDemo {


    /**
     * 创建job是我们的任务,你要去做的事情
     * @return JobDetailFactoryBean
     */
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean jobFactoryBean = new JobDetailFactoryBean();
        jobFactoryBean.setJobClass(SpringbootQuartzJob.class);
        return jobFactoryBean;
    }

    /**
     * 复杂的触发器,你什么时间去做
     * @param jobDetailFactoryBean
     * @return
     */
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
        triggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        triggerFactoryBean.setCronExpression("0/2 * * * * ?");
        return triggerFactoryBean;
    }

    /**
     * 简单的 触发器 ,你什么时间去做
     * @param jobDetailFactoryBean
     * @return SimpleTriggerFactoryBean
     */
//    @Bean
//    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
//        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
//        factoryBean.setJobDetail(jobDetailFactoryBean.getObject());
          // 多久执行一次,2秒
//        factoryBean.setRepeatInterval(2000);
          // 每2秒执行一次个任务,执行5次后就不执行了
//        factoryBean.setRepeatCount(5);
//        return factoryBean;
//    }


    /**
     * scheduled调度器:调度什么时候去做什么事情
     * @param cronTriggerFactoryBean
     * @return schedulerFactoryBean
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean,MyAdaptableJobfactory myAdaptableJobfactory) {
        SchedulerFactoryBean schedulerFactoryBean =new SchedulerFactoryBean();
        schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
        schedulerFactoryBean.setJobFactory(myAdaptableJobfactory);
        return schedulerFactoryBean;
    }
}

如果要通过@Autowired注入我们的对象如下注入我们UserService中的一个addUser方法,如果直接执行的话会报一个java.lang.NullPointerException: null异常。需要我们重写AdaptableJobFactory中的createJobInstance方法,加入到spring容器中(不重写是通过反射来实现的没有加入我们spring容器)。

/**
 * @author ysy
 */
@Service
public class UserService {

    public void addUser() {
        System.out.println("hello,定时注入成功!");
    }
}
/**
 * @author ysy
 */
public class SpringbootQuartzJob implements Job {

    @Autowired
    private UserService userService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("整合任务开始,时间是:"+ new Date());
        this.userService.addUser();
    }
}

重写createJobInstance方法如下:

/**
 * @author ysy
 */
@Component
public class MyAdaptableJobfactory extends AdaptableJobFactory {

    // 手动注入到我们的spring容器中
    @Autowired
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        // 注入到spring容器中
        autowireCapableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

运行每2秒执行一次结果:

2022-04-24 00:21:41.727  INFO 21728 --- [           main] s.SpringbootQuartzIntegrationApplication : Started SpringbootQuartzIntegrationApplication in 0.646 seconds (JVM running for 1.278)
整合任务开始,时间是:Sun Apr 24 00:21:42 CST 2022
hello,定时注入成功!
整合任务开始,时间是:Sun Apr 24 00:21:44 CST 2022
hello,定时注入成功!
整合任务开始,时间是:Sun Apr 24 00:21:46 CST 2022
hello,定时注入成功!

Process finished with exit code -1

简单的任务可以用scheduled,复杂的可以用Quartz。如有错误,或者不足欢迎留言哈!希望能帮到你,祝你工作顺利!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/740165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存