springboot启动时执行任务之CommandLineRunner

      对接微信小程序接口时,在项目重新启动时需要将数据库的openId批量缓存到redis中,便于后面的业务处理,此处用到了CommandLineRunner接口,通过实现这接口中的run方法便于我们进行相关的业务逻辑代码的处理。

      如果有多个启动任务呢,我们只需要加上@order注解表明执行加载顺序即可依次执行了。

      任务一:项目重新启动清除数据字典并加载最新字典

       

@Component
@Slf4j
@Order(value = 1)
public class DictListener implements CommandLineRunner {
    @Autowired
    private RedisService redisService;

    @Override
    public void run(String... args) throws Exception {
        log.info("-----------------启动了springBoot---------------");
        log.info("开始清除字典缓存----------1");
        CurrentUserHolder.setTime(System.currentTimeMillis());
        redisService.empty(TMPConstant.DICT_VALUE);
        redisService.empty(TMPConstant.DICT_KEY);
        log.info("清除字典缓存成功,耗时:{}",(System.currentTimeMillis() - CurrentUserHolder.getTime()));
    }
}

        任务二:项目重新启动清除微信小程序openId并缓存最新数据库openId

/**
 * 字典项后加载执行
 * @author admin
 */
@Component
@Slf4j
@Order(value = 2)
public class UserOpenIdListener implements CommandLineRunner {

    @Autowired
    private RedisService redisService;

    @Autowired
    private TpUserMapper tpUserMapper;

    @Override
    public void run(String... args) throws Exception {
        log.info("开始清除openId缓存----------2");
        CurrentUserHolder.setTime(System.currentTimeMillis());
        redisService.remove(TMPConstant.OPEN_ID_CACHE);
        log.info("清除字典openId缓存成功,耗时:{}",(System.currentTimeMillis() - CurrentUserHolder.getTime()));
        List<String> openIdList = tpUserMapper.queryUsersOpenId();
        log.info("查询数据库最新openId数据共{}条",openIdList.size());
        redisService.put(TMPConstant.OPEN_ID_CACHE,openIdList,-1L);
        log.info("openId数据已缓存");
    }
}

      注意,执行顺序是先清除字典后清除openId,下面看执行结果

     

     程序如@order注解标识,按序执行,便于那些后续执行的任务需要采用到先执行任务的一些属性和数据,根据加载顺序的不同来实现。

     下面展现CommandLineRunner的源代码,其实就是一个run方法,通过springboot的内置加载规则进行预加载

    

package org.springframework.boot;

@FunctionalInterface
public interface CommandLineRunner {
    void run(String... var1) throws Exception;
}

@FunctionalInterface注解运用于编译检查,大家自行熟悉即可。

 其中涉及了redis的一些读取删除操作,都是很平常的功能实现啦,一起学习一起进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值