Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring @EventListener(ApplicationReadyEvent.class)只启动一个方法?_Spring_Spring Boot - Fatal编程技术网

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

Spring @EventListener(ApplicationReadyEvent.class)只启动一个方法?,spring,spring-boot,Spring,Spring Boot,我正在尝试在SpringBoot项目启动后运行一些方法。我正在使用@EventListener(ApplicationReadyEvent.class)注释,这些注释位于我希望在项目启动后运行的方法之上。但一次只能开始一种方法。我希望同时启动多个方法。@EventListener(ApplicationReadyEvent.class)的预期行为是否正确?可以放置几个(多个)用@EventListener注释的方法,所有这些方法都将被执行: @Configuration public class

我正在尝试在SpringBoot项目启动后运行一些方法。我正在使用
@EventListener(ApplicationReadyEvent.class)
注释,这些注释位于我希望在项目启动后运行的方法之上。但一次只能开始一种方法。我希望同时启动多个方法。
@EventListener(ApplicationReadyEvent.class)
的预期行为是否正确?

可以放置几个(多个)用
@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");
    }

}
这将在成功启动应用程序上下文时打印“你好”和“你好”

现在,spring确实没有并发调用它们,它解析所有侦听器并按顺序调用它们

如果需要并行执行,可以创建一个侦听器,作为必须并行运行的逻辑任务的“入口点”,并使用线程/线程池执行器并行运行您选择的代码使用
@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");
    }

}
这将在成功启动应用程序上下文时打印“你好”和“你好”

现在,spring确实没有并发调用它们,它解析所有侦听器并按顺序调用它们


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

您是否尝试在方法上方添加
@Async

此侦听器是同步调用的。您只需添加
@Async
注释即可使其异步。

您是否也尝试在方法上方添加
@Async

此侦听器是同步调用的。您可以通过简单地添加
@Async
注释使其异步。

您可以通过向
@Configuration
类添加以下bean使事件侦听器异步执行

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

如果定义了自定义的
任务执行器
,则应将
新的SimpleAsynctaskeExecutor()
替换为
自定义任务执行器beanMethod()

,通过将以下bean添加到
@配置
类中,可以让事件侦听器异步执行

@Bean(name = "applicationEventMulticaster")
public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
    SimpleApplicationEventMulticaster eventMulticaster =
      new SimpleApplicationEventMulticaster();
    
    eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
    return eventMulticaster;
}
如果已定义自定义的
任务执行器
,则应将
新的SimpleAsyncTaskExecutor()
替换为
自定义任务执行器beanMethod()