首页 > 基础资料 博客日记

springboot定时任务在项目启动后立即执行一次

2024-10-18 03:00:07基础资料围观83

Java资料网推荐springboot定时任务在项目启动后立即执行一次这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

背景: 写了一个定时任务去每隔15分钟,定时从三方系统获取凭证,然后更新到Redis中去。

存在问题: 当项目重新启动时定时任务要等15分钟才能去获取,中间存在空挡期。

解决办法: 让定时任务在项目启动后立即执行一次,后续按照cron表达式正常执行

方案一:使用 @PostConstruct

@PostConstruct注解标注的方法会在bean 加载时主动执行该方法

 @Scheduled(cron = "0 */15 * * * ? ")
    public void updateAuthorization() {
    	
        LockUtil.tryLock(key, () -> {
            log.info("开始刷新访问凭证========");
            //业务代码
            log.info("刷新访问凭证结束========");
        }, e -> log.error("刷新访问凭证失败", e));
    }

	//bean加载时主动执行的方法
    @PostConstruct
    public void init(){
        updateAuthorization();
    }

notes:但是此方法可能会出现问题,当你的业务处理中用了其他的bean的时候 该bean可能可能还未被放进spring容器中,从而存在隐患。

方案二:实现 ApplicationRunner 接口

ApplicationRunner接口里有一个run()方法,实现这个接口,并重写run()方法,在run()方法中直接调用定时任务即可。

我是新写了一个类,这个类可以用来专门去提供 项目启动后 的一些处理操作,不去破坏原有的线程独立。

/**
 * @author : lichengqian
 * 2024-07-19  11:23
 */

/**
 * 该类中的run方法在项目启动后会立即执行一次
 */
@Component
public class StartRunner implements ApplicationRunner {
    @Resource
    AuthorizationScheduler authorizationScheduler;


    //项目启动后会立即执行一次
    @Override
    public void run(ApplicationArguments args) throws Exception {
        authorizationScheduler.updateAuthorization();
        //其他需要启动后执行的处理操作
    }
}

文章来源:https://blog.csdn.net/qq_44642851/article/details/140627229
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云