@EventListener(ApplicationReadyEvent.class) 只启动一种方法?

我正在尝试在 Spring Boot 项目启动后运行一些方法。我在项目启动后要运行的方法上方使用 @EventListener(ApplicationReadyEvent.class) 注释。但它一次只从一种方法开始。我想同时启动多种方法。这是 @EventListener(ApplicationReadyEvent.class) 的预期行为吗?

stack overflow @EventListener(ApplicationReadyEvent.class) starts only one method?
原文答案

答案:

作者头像

可以放置几个(多个)用 @EventListener 注释的方法,所有这些方法都将被执行:

@Configuration
public class SampleConfiguration {

    @Bean
    public SampleBean sampleBean() {return new SampleBean();}  

    @EventListener
    public void onApplicationReadyEvent(ApplicationReadyEvent event) {
        System.out.println("Hello");
    }

    @EventListener
    public void onApplicationReadyEvent2(ApplicationReadyEvent event) {
        System.out.println("How are you");
    }

}

这将在应用程序上下文成功启动时打印“Hello”和“How are you”。

现在,spring 确实不会同时调用它们,它解析所有侦听器并按顺序调用它们。

如果您需要并行执行,您可以创建一个侦听器,作为必须并行运行的逻辑任务的“入口点”,并使用线程/线程池执行器并行运行您选择的代码

作者头像

您是否尝试在方法上方添加 @Async ?此侦听器是同步调用的。您可以通过简单地添加 @Async 注释使其异步。

作者头像

您可以通过将以下 bean 添加到您的 @Configuration 类来让事件侦听器异步执行。

@Bean(name = "applicationEventMulticaster")
public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
    SimpleApplicationEventMulticaster eventMulticaster =
      new SimpleApplicationEventMulticaster();

    eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
    return eventMulticaster;
}

如果你定义了一个自定义的 TaskExecutor 那么你应该用 new SimpleAsyncTaskExecutor() 替换 yourCustomTaskExecutorBeanMethod()