springboot项目启动后就执行特定方法

实现springboot项目启动后就执行特定方法

所遇到的问题:

在项目启动中初始化数据时调用其他feign client的方法时调不通,报“com.netflix.hystrix.exception.HystrixRuntimeException: UserApi#queryWxAttentionOpenIdList() timed-out and no fallback available.”,如何解决这个问题呢?

分析:

因为在启动时因为加载机制并不能找到userApi所属服务所在位置,只能通过启动成功后去调用,那又如何实现项目启动成功后立刻去实现我想实现的业务(比如初始化数据)呢?

ApplicationRunnerCommandLineRunner。这两个接口是Springboot给我们提供的两种“开机启动”方式

ApplicationRunner:

源码如下:

      public interface ApplicationRunner {

          void run(ApplicationArguments var1) throws Exception;
      }

CommandLineRunner  :

源码如下:

         public interface CommandLineRunner {

          void run(String... var1) throws Exception;
     }
相同点:这两种方法提供的目的是为了满足在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和CommandLineRunner来实现,他们都是在SpringApplication 执行之后开始执行的。
不同点:CommandLineRunner接口可以用来接收字符串数组的命令行参数,ApplicationRunner 是使用ApplicationArguments 用来接收参数的

例如我实现启动成功后立即去调用另一个服务查询用户关注信息初始值:

@Component
public class UserAttentionInitRunner implements ApplicationRunner {

    @Autowired
    private WeChatUserAttentionService weChatUserAttentionService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        weChatUserAttentionService.loadDataFromDb();
    }
}

如果是执行的方法不止一个且有顺序时则需要通过@Order(value = n)注解来指定顺序,n值越小越先执行

 

 

 

 


版权声明:本文为m0_37637141原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。