У меня есть следующий класс:
package org.edgexfoundry.pkg; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync @EnableDiscoveryClient public class Application { public static ConfigurableApplicationContext ctx; public static void main(String[] args) { ctx = SpringApplication.run(Application.class, args); System.out.println("WELCOME!"); }
и в другом классе того же проекта у меня есть:
@ImportResource("spring-config.xml") public class BaseService { @PostConstruct private void postConstructInitialize() { logger.debug("post construction initialization"); } }
, где мой spring-config.xml файл:
spring-config.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:*.properties" /> <bean class="org.edgexfoundry.pkg.HeartBeat" /> <context:component-scan base-package="org.edgexfoundry.pkg" /> <context:component-scan base-package="org.edgexfoundry" /> </beans>
и HeartBeat класс:
HeartBeat
@EnableScheduling public class HeartBeat { private static final EdgeXLogger logger = EdgeXLoggerFactory.getEdgeXLogger(HeartBeat.class); @Scheduled(fixedRateString = "${heart.beat.time}") public void pulse() { logger.info("Beating..."); } }
Когда я запускаю проект, я получаю следующий вывод:
BySpringCGLIB$$1088c4ff] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) /******************************************************************************* * Copyright 2017, Dell, Inc. All Rights Reserved. ******************************************************************************/ WELCOME! 2019-04-02 12:50:24.574 INFO 1 --- [ main] org.edgexfoundry.pkg.Application : No active profile set, falling back to default profiles: default
и через долгое время , (около 8 минут) я получаю последнюю строку:
2019-04-02 12:57:04.611 DEBUG 1 --- [ main] org.edgexfoundry.pkg.BaseService : post construction initialization
Что делается в это время? Почему метод @PostConstruct требует так много времени для запуска, т. Е. Почему метод SpringApplication.run() заканчивается так поздно? Есть идеи?
@PostConstruct
SpringApplication.run()
Одной из причин, по-видимому, медленного запуска является реализация по умолчанию SecureRandom, которая сканирует сетевые интерфейсы, чтобы обеспечить дополнительный источник энтропии системы.
SecureRandom
Этого можно избежать, зарегистрировав собственный java.security.Provider или воспользовавшись SecureRandomSpi.
java.security.Provider
SecureRandomSpi
Среди прочего есть это хорошее введение в тему (быстрой) и безопасной генерации псевдослучайных чисел в Java.