Я хочу запустить код после того, как мое приложение весенней загрузки начнет отслеживать каталог на предмет изменений.
Я попытался запустить новый поток, но @Autowired
службы не были установлены в этот момент.
Я был в состоянии найти ApplicationPreparedEvent
, который срабатывает до того, как @Autowired
аннотации установлены. В идеале я хотел бы, чтобы событие запускалось, когда приложение готово к обработке запросов http.
Есть ли лучшее событие для использования или лучший способ запуска кода после того, как приложение будет запущено при весенней загрузке ?
java
spring
spring-boot
stewsters
источник
источник
Ответы:
Пытаться:
источник
@Component
. Смотрите ответ @cjstehno, чтобы заставить его работать в файле войны.Это так просто, как это:
Проверено на версии
1.5.1.RELEASE
источник
@EventListener(ContextRefreshedEvent.class)
вместо этого, который запускается после создания компонента, но до запуска сервера. Его можно использовать для выполнения действий до того, как какие-либо запросы попадут на сервер.ContextRefreshedEvent
, он будет работать после каждого обновления тоже.Вы пробовали ApplicationReadyEvent?
Код от: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
Вот что упоминается в документации о событиях запуска:
источник
@EventListener
аннотацию к методу Bean, передавая в качестве аргумента событие класса, к которому вы хотите подключиться.Почему бы просто не создать компонент, который запускает ваш монитор при инициализации, что-то вроде:
init
метод не будет вызываться до любого автоматического связывания не делается для боба.источник
@PostConstruct
срабатывает слишком рано. Например, при использовании Spring Cloud Stream Kafka@PostConstruct
срабатывает перед привязкой приложения к Kafka. Решение Дэйва Сайера лучше, потому что оно срабатывает своевременно.@PostConstruct
происходит во время инициализации, а не после. Хотя это может быть полезно в некоторых случаях, это неправильный ответ, если вы хотите запустить после запуска Spring Boot. Например, пока@PostConstruct
не заканчивается, ни одна из конечных точек не доступна.«Spring Boot» - это использование
CommandLineRunner
. Просто добавьте бобы этого типа, и все готово. В Spring 4.1 (Boot 1.2) также естьSmartInitializingBean
функция обратного вызова после того, как все инициализировано. И естьSmartLifecycle
(с весны 3).источник
CommandLineRunner
(и более новыхApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Вы можете расширить класс, используя
ApplicationRunner
, переопределитьrun()
метод и добавить туда код.источник
ApplicationReadyEvent
действительно полезно, только если задача, которую вы хотите выполнить, не является обязательной для правильной работы сервера. Хороший пример - запуск асинхронной задачи для отслеживания изменений.Однако, если ваш сервер находится в состоянии «не готов» до тех пор, пока задача не будет завершена, его лучше реализовать,
SmartInitializingSingleton
поскольку вы получите обратный вызов до того, как ваш порт REST будет открыт, а ваш сервер открыт для бизнеса.Не поддавайтесь искушению использовать
@PostConstruct
для задач, которые должны произойти только один раз. Вы получите грубый сюрприз, когда заметите, что он вызывается несколько раз ...источник
С пружинной конфигурацией:
источник
Используйте
SmartInitializingSingleton
боб весной> 4.1В качестве альтернативы
CommandLineRunner
bean-компонент может быть реализован или аннотировать метод bean-компонента с помощью@PostConstruct
.источник
Предоставление примера для ответа Дейва Сайера, который работал как обаяние:
источник
Попробуйте это, и он запустит ваш код, когда контекст приложения полностью запустится.
источник
Мне очень нравится предложение об использовании
EventListener
аннотации @cahen ( https://stackoverflow.com/a/44923402/9122660 ), поскольку она очень чистая. К сожалению, я не смог заставить это работать в настройках Spring + Kotlin. Что работает для Kotlin, так это добавление класса в качестве параметра метода:источник
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
Лучший способ выполнить блок кода после запуска приложения Spring Boot - использовать аннотацию PostConstruct. Или вы также можете использовать для этой цели средство запуска командной строки.
1. Использование аннотации PostConstruct
2. Использование bean-компонента командной строки
источник
просто внедрите CommandLineRunner для весенней загрузки приложения. Вам нужно реализовать метод запуска,
источник
Наилучший способ использования CommandLineRunner или ApplicationRunner Единственное отличие заключается в том, что метод run () CommandLineRunner принимает массив строк, а ApplicationRunner принимает ApplicationArugument.
источник