springboot2.X 在项目启动后执行一段自定义代码

场景: 项目需要在项目启动后从数据库初始化一些数据进入redis , 但是没有很适合 的监听器去实现 , 监听 老是在dao初始化之前触发。

解决方法:自定义类实现 ApplicationRunner 接口 重写 run() 方法

------------------------------------------------------------------------------------------------------------------------------------------

 1 /**
 2  * @author :CX
 3  * @Date :Create in 2018/8/31 11:39
 4  * @Effect : 监听项目启动成功后, 每次启动给启动序列码+1(tb_sb_idcounter表) ,
 5  *              并吧最新的序列码写入redis
 6  */
 7 @Component
 8 @Order(10) //执行的优先级
 9 public class StartIdListener implements ApplicationRunner {
10     Logger logger =  Logger.getLogger(this.getClass().getName());
11     //注入针对数据库的dao
12     @Autowired
13     @Qualifier("dao")
14     protected IDao dao;
15     //注入针对redis的dao
16     @Autowired
17     RedisUtil redisUtil ;
18 
19     // 系统启动序列码在redis中保存的key
20     private String SYSTEM_NUMBER = "bigcustomer:systemNumber_fh23" ;
21     // 本次啓動 , 通用id 执行到几了, 继续执行
22     private String FUNIQUEID_NUMBER = "bigcustomer:funiqueid_number" ;
23     /**
24      *@参数
25      *@返回值
26      *@创建人  cx
27      *@创建时间
28      *@描述 zaispringboot启动后执行
29      */
30     @Override
31     public void run(ApplicationArguments args) throws Exception {
32         //数据库启动序列码 +1
33         logger.info("项目启动成功, 开始获取启动码!");
34         try{
35             dao.update("util-baseIdUpOne");
36         }catch (Exception e){
37             throw  new RuntimeException("启动失败,启动序列码执行+1 操作时异常!请检查 tb_sb_idcounter表");
38         }
39         // 获取最新数据
40         TbSbIdcounterModel first = dao.entity(TbSbIdcounterModel.class).first();
41         if(null == first || null == first.getFH23()){
42             throw  new RuntimeException("启动失败,启动序列码为空,请检查 tb_sb_idcounter表");
43         }
44         Long fh23 = first.getFH23();
45         // 保存启动序列码到redis
46         redisUtil.set(SYSTEM_NUMBER,fh23);
47         // 初始化本次 轮训的编码
48         redisUtil.set(FUNIQUEID_NUMBER,1);
49 
50 
51         logger.info("获取启动码成功, 本次系统启动码为:" + fh23);
52     }
53 }

猜你喜欢

转载自www.cnblogs.com/cx987514451/p/9590529.html
今日推荐