当前位置: 首页 > 知识库问答 >
问题:

为什么Spring boot在使用Eureka时执行SpringApplicationRunListener两次

濮阳驰
2023-03-14

我使用以下方法定义了一个简单的SpringApplicationRunListener实现:

@Override
public void finished(ConfigurableApplicationContext configurableApplicationContext, Throwable throwable) {
    logger.info("It's finished");
}

当我在没有任何Spring cloud依赖项的情况下运行时,我会得到以下日志:

2016-04-27 10:37:37.702  INFO 5720 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-04-27 10:37:37.703  INFO 5720 --- [           main] b.a.test.LazyFilterRuntimeListener       : It's finished
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2016-04-27 10:37:35.500  INFO 5720 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@255b53dc: startup date [Wed Apr 27 10:37:35 CEST 2016]; root of context hierarchy
2016-04-27 10:37:35.638  INFO 5720 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2016-04-27 10:37:35.785  INFO 5720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'encrypt.CONFIGURATION_PROPERTIES' of type [class org.springframework.cloud.bootstrap.encrypt.KeyProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2016-04-27 10:37:35.786  INFO 5720 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'encryptionBootstrapConfiguration' of type [class org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration$$EnhancerBySpringCGLIB$$268d5fc8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2016-04-27 10:37:35.839  INFO 5720 --- [           main] b.c.test.LazyFilterRuntimeListener       : It's finished
2016-04-27 10:37:35.842  INFO 5720 --- [           main] be.company.test.TestApplication   : Started TestApplication in 0.499 seconds (JVM running for 0.86)

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.7.RELEASE)


...

2016-04-27 10:37:37.702  INFO 5720 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-04-27 10:37:37.703  INFO 5720 --- [           main] b.c.test.LazyFilterRuntimeListener       : It's finished
2016-04-27 10:37:37.703  INFO 5720 --- [           main] be.company.test.TestApplication   : Started TestApplication in 2.423 seconds (JVM running for 2.721)

它还两次提到“在...开始应用程序”这句话。

这种行为有什么特别的原因吗?我正在尝试编写一个SpringApplicationRunListener,它依赖于已经创建的特定bean。但是,如果我添加spring cloud,当它第一次到达finished()方法时,上下文尚未创建,因此当前抛出一个错误。

共有1个答案

张承颜
2023-03-14

实际上,有一个双重调用日志记录的问题。默认情况下,Spring Boot设置信息级日志记录。

1.3之前的spring boot的早期版本,因为您正在使用1.2.7然后它使用

如果您不能通过添加MDC值来覆盖spring Boot的CONSOLE_LOG_PATTERN,那么您似乎必须对每个日志消息进行两次写入!(一次使用spring boot console appender,一次使用您的console appender并将MDC添加到模式中)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>
  1. https://github.com/spring-projects/spring-boot/issues/1788
  2. https://github.com/spring-projects/spring-boot/issues/2558
 类似资料:
  • 问题内容: 目标。当启动django框架时,还要启动其他依赖django对象的PY脚本。从配置文件获取服务器和端口号。 问题:Popen似乎运行了两次,我不确定为什么吗? 输出: 这是我的第一次尝试,因此,如果有人知道更好的方法,请随时告诉我。 谢谢大家。 问题答案: 您的代码正在启动命令,这将导致Django使用reloader,这反过来意味着您的代码将像在命令行中输入的那样被重新执行。如果您在

  • 我们什么时候应该使用Spring boot执行器。如果包括在内,它对应用程序内存和CPU使用有多大影响? 我目前正在使用Spring Boot 2. x。

  • 问题内容: 我正在尝试使用编写一个简单的代码,但是只是不愿等待它假定的时间而代码立即执行。我究竟做错了什么? 问题答案: 您正在立即调用该函数并计划其返回值。 使用: 注意:没有原谅。

  • 问题内容: 最近升级到Spark 2.0,尝试从JSON字符串创建简单的数据集时遇到一些奇怪的行为。这是一个简单的测试用例: 并输出: 即使我仅执行一项操作,“ map”功能似乎仍被执行两次。我以为Spark会懒惰地建立一个执行计划,然后在需要时执行它,但这似乎使得为了将数据读取为JSON并对其进行任何处理,该计划必须至少执行两次。 在这种简单的情况下,这并不重要,但是当map函数长时间运行时,这

  • react class组件在componentDidMount中调用初始化接口,有些时候会调用两次,通过断点发现顺序是componentDidMount->componentWillUnmount->componentDidMount,但不能稳定复现,调用的组件是页面的主入口,并非某个组件的子组件,请问有知道这个问题的么?

  • 《Java并发实践》(Brian Goetz)中对此进行了阐述(重点是我的): 当Future.get抛出中断或超时异常,并且您知道程序不再需要结果时,请用F取消任务uture.cancel Javadoc for Future.get声明(突出显示的是我的): 抛出InterruptedException-如果当前线程在等待时被中断 因此,据我所知:如果我得到InterruptedExcepti