Spring Boot @EventListener(ApplicationReadyEvent.class)只启动一个方法?

bogh5gae  于 2022-12-29  发布在  Spring
关注(0)|答案(4)|浏览(289)

我尝试在Sping Boot 项目启动后运行一些方法。我在项目启动后运行的方法上方使用@EventListener(ApplicationReadyEvent.class)注解。但一次只能启动一个方法。我希望同时启动多个方法。这是@EventListener(ApplicationReadyEvent.class)的预期行为吗?

n8ghc7c1

n8ghc7c11#

放置几个(不止一个)用@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确实不会并发调用它们,它解析所有侦听器并顺序调用它们。
如果需要并行执行,可以创建一个侦听器,作为必须并行运行的逻辑任务的“入口点”,并使用线程/线程池执行器并行运行您选择的代码

vcudknz3

vcudknz32#

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

dkqlctbz

dkqlctbz3#

通过将以下bean添加到@Configuration类中,可以使事件侦听器异步执行。

@Bean(name = "applicationEventMulticaster")
public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
    SimpleApplicationEventMulticaster eventMulticaster =
      new SimpleApplicationEventMulticaster();
    
    eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
    return eventMulticaster;
}

如果定义了自定义TaskExecutor,则应将new SimpleAsyncTaskExecutor()替换为yourCustomTaskExecutorBeanMethod()

pepwfjgg

pepwfjgg4#

我曾经遇到过类似的问题,ApplicationReadyEvent被标注为3个函数,但在调试中我们发现它总是只触发1个。我们添加了@Order,并将该函数保留为索引最高(即优先级最低)的函数,因为在我们的示例中,它运行了一个不确定的while循环,并发现所有3个函数都被无缝调用。

相关问题