[spring-projects/spring-boot]与 spring-cloud-starter-config 结合使用时,启动生命周期事件会多次触发

2018-10-01 678 views

回答

1

这是在 spring-cloud-commons 中有意为之的。 Bootstrap 创建一个父上下文。

8

有一组引导程序的生命周期事件(请注意日志中“Spring”徽标之前的事件)。

之后,会出现多个相同类型的事件,甚至是多次出现的相同事件的同一实例。

3

我不认为它被“解雇”两次,只是听了两次

9

如果我只有一个事件侦听器,该侦听器是否应该多次接收同一事件的同一实例?如果是这样,那么侦听器是否不需要记住它是否已经处理过事件?

4

我可以验证它AppListener被创建了两次:一次在引导程序中,一次在子程序中。

3

你是对的。但随后主上下文中相同 ApplicationPreparedEvent 的实例被接收 3 次,相同的 ApplicationReady 事件被接收两次,等等。

8

我相信应用程序事件在上下文层次结构中传播(不记得哪个方向)。

0

那么为什么我会得到 2 个一种事件,3 个其他事件呢?

0

没有把握。我绝对不认为这是启动问题。以前在春云里出现过。一般来说,您可以关闭引导程序或对事件进行防护。

3

我认为你说得对,这不是启动问题。如果我删除对配置客户端的依赖,一切都很好 - 我只看到每种类型的 1 个事件(并且只有一个上下文)。

只是添加对配置客户端的依赖项似乎很奇怪,我突然需要编写防御逻辑以确保我不会多次处理同一事件(预计每个上下文处理一次)。

也许这是配置客户端的问题?

7

它不是配置客户端,它是 spring-cloud-commons 项目,spring-cloud-context 模块。它使刷新范围发挥作用,并允许在常规应用程序上下文启动之前进行远程配置。正如我所说,您可以使用 禁用引导程序(但您会失去功能)spring.cloud.bootstrap.enabled=false。这种情况出现过几次,但一般来说,采取防御措施就足够了。我们应该在此处添加有关如何防御应用程序侦听器的注释:http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_spring_cloud_context_application_context_services

3

很抱歉在该问题关闭后添加 - 但我还有 1 个问题。 s在启动生命周期的什么时候应该configService PropertySource可用?ApplicationEnvironmentPreparedEvent如果设置为最低优先级,它们是否应该在“主”应用程序中可用?

5

正如 Stack Overflow 上所讨论的,这是一个 Spring Cloud 问题。他们在 Gitter 上

1

抱歉 - 我想既然这里有这个讨论,我可以补充一下。我去做。带来不便敬请谅解。