当服务器准备就绪时,如何在Spring中执行方法?

时间:2015-04-23 13:14:11

标签: java spring spring-boot

我有以下问题:我正在使用Spring-Boot进行一个基于Web的私有项目,我希望Spring在启动时调用Web服务。开始时我的意思是“当我的应用程序准备好处理请求时”。

我已尝试实施ApplicationListener< ContextRefreshedEvent>但它没有工作,因为事件发生在早期(即嵌入式服务器准备好处理请求之前)。 this question中提到的选项也没有解决这个问题。

我现在的问题是:在服务器完成启动并准备好处理请求后,是否有可能告诉Spring执行某些操作?

编辑(回应丹尼尔的回答):

问题是我需要一些注入的属性来进行webservice调用,并且因为注入静态值在spring中不起作用,所以这种方法是没有选择的。

我的听众,做我想做的事,有点太早看起来像这样:



@Component
public class StartupListener implements ApplicationListener{


    @Autowired
    private URLProvider urlProvider;
    @Value("${server.port}")
    private int port;
    @Value("${project.name}")
    private String projectName;

    @Override
    public final void onApplicationEvent(ContextRefreshedEvent event) {
        RestTemplate template = new RestTemplate();
        String url = uriProvider.getWebserviceUrl(this.projectName);
        template.put(url, null);
    }

}

第二次编辑:

虽然this问题解决了一个非常类似的问题,但似乎我无法注入到对象中,因为它需要有一个表单的构造函数(org.springframework.boot.SpringApplication,[Ljava。 lang.String;)

在不必创建spring.factories文件但使用注释的情况下解决它也是绝望的。

3 个答案:

答案 0 :(得分:1)

如果我了解您的问题,您可以在应用程序主服务器启动后立即调用该服务器上的Web服务。

public static void main(String[] args) {

        new SpringApplication(Application.class).run(args);
        //call the webservice for you to handle...
    }

我不确定这是不是你想要的......

答案 1 :(得分:0)

在您的组件中,您可以使用@PostConstruct注释。 e.g。

@Component
public class StartupListener {


    @Autowired
    private URLProvider urlProvider;
    @Value("${server.port}")
    private int port;
    @Value("${project.name}")
    private String projectName;

    @PostConstruct
    public final void init() {
        RestTemplate template = new RestTemplate();
        String url = uriProvider.getWebserviceUrl(this.projectName);
        template.put(url, null);
    }

}

一旦bean初始化并自动装配,就会触发。

答案 2 :(得分:0)

  @Component
  public class StartUp implements ApplicationListener<WebServerInitializedEvent> {

  private WebClient webClient;

  @Override
  public void onApplicationEvent(WebServerInitializedEvent event) {

    String baseUrl = "http://url.com"
    webClient = WebClient.create(baseUrl);
    executeRestCall(baseUrl+"/info");
  }

  void executeRestCall(String uri) {
    try {
      webClient.get()
          .uri(uri)
          .exchange()
          .block();
    } catch (Exception e) {
      log.error("Request failed for url - {}",uri, e);
    }
  }}