我尝试在Sping Boot 项目启动后运行一些方法。我在项目启动后运行的方法上方使用@EventListener(ApplicationReadyEvent.class)
注解。但一次只能启动一个方法。我希望同时启动多个方法。这是@EventListener(ApplicationReadyEvent.class)
的预期行为吗?
我尝试在Sping Boot 项目启动后运行一些方法。我在项目启动后运行的方法上方使用@EventListener(ApplicationReadyEvent.class)
注解。但一次只能启动一个方法。我希望同时启动多个方法。这是@EventListener(ApplicationReadyEvent.class)
的预期行为吗?
4条答案
按热度按时间n8ghc7c11#
放置几个(不止一个)用
@EventListener
注解的方法是可以的,所有这些方法都将被执行:这将在成功启动应用程序上下文时打印“Hello”和“How are you”。
现在,spring确实不会并发调用它们,它解析所有侦听器并顺序调用它们。
如果需要并行执行,可以创建一个侦听器,作为必须并行运行的逻辑任务的“入口点”,并使用线程/线程池执行器并行运行您选择的代码
vcudknz32#
您是否也尝试在方法上添加
@Async
?此侦听器是同步调用的。您可以通过简单地添加@Async
注解使其异步。dkqlctbz3#
通过将以下bean添加到
@Configuration
类中,可以使事件侦听器异步执行。如果定义了自定义
TaskExecutor
,则应将new SimpleAsyncTaskExecutor()
替换为yourCustomTaskExecutorBeanMethod()
pepwfjgg4#
我曾经遇到过类似的问题,ApplicationReadyEvent被标注为3个函数,但在调试中我们发现它总是只触发1个。我们添加了@Order,并将该函数保留为索引最高(即优先级最低)的函数,因为在我们的示例中,它运行了一个不确定的while循环,并发现所有3个函数都被无缝调用。