对接微信小程序接口时,在项目重新启动时需要将数据库的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的一些读取删除操作,都是很平常的功能实现啦,一起学习一起进步