栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring Boot定时任务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring Boot定时任务

一,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 {

    
    @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三个对象。


@Configuration
public class ConfigQuartzDemo {


    
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean jobFactoryBean = new JobDetailFactoryBean();
        jobFactoryBean.setJobClass(SpringbootQuartzJob.class);
        return jobFactoryBean;
    }

    
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
        triggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        triggerFactoryBean.setCronExpression("0/2 * * * * ?");
        return triggerFactoryBean;
    }

    
//    @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;
//    }


    
    @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容器)。

@Service
public class UserService {

    public void addUser() {
        System.out.println("hello,定时注入成功!");
    }
}
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方法如下:

@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。如有错误,或者不足欢迎留言哈!希望能帮到你,祝你工作顺利!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号