Quero executar o código depois que meu aplicativo de inicialização por primavera começar a monitorar um diretório em busca de alterações.
Eu tentei executar um novo thread, mas os @Autowired
serviços não foram definidos nesse ponto.
Eu consegui encontrar o ApplicationPreparedEvent
que é acionado antes que as @Autowired
anotações sejam definidas. Idealmente, eu gostaria que o evento fosse acionado assim que o aplicativo estiver pronto para processar solicitações http.
Existe um evento melhor para usar ou uma maneira melhor de executar código depois que o aplicativo estiver ativo na inicialização por mola ?
java
spring
spring-boot
guisados
fonte
fonte
Respostas:
Experimentar:
fonte
@Component
. Veja a resposta de @cjstehno para que ele funcione em um arquivo de guerra.É tão simples quanto isto:
Testado na versão
1.5.1.RELEASE
fonte
@EventListener(ContextRefreshedEvent.class)
, que é acionado após a criação do bean, mas antes do servidor iniciar. Pode ser usado para executar atividades antes que qualquer solicitação atinja o servidor.ContextRefreshedEvent
, ele será executado após cada atualização também.Você já tentou o ApplicationReadyEvent?
Código de: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
Isto é o que a documentação menciona sobre os eventos de inicialização:
fonte
@EventListener
anotação no método Bean, passando como argumento o evento de classe ao qual deseja conectar.Por que não criar um bean que inicia o monitor na inicialização, algo como:
o
init
método não será chamado até que qualquer ligação automática seja feita para o bean.fonte
@PostConstruct
acionado muito cedo. Por exemplo, ao usar o Spring Cloud Stream Kafka, é@PostConstruct
acionado antes que o aplicativo seja vinculado ao Kafka. A solução de Dave Syer é melhor porque é acionada em tempo hábil.@PostConstruct
acontece durante a inicialização, não depois. Embora isso possa ser útil em alguns casos, não é a resposta correta se você deseja executar após o início do Spring Boot. Por exemplo, embora@PostConstruct
não seja concluído, nenhum dos pontos de extremidade está disponível.A maneira "Spring Boot" é usar a
CommandLineRunner
. Basta adicionar grãos desse tipo e você estará pronto. No Spring 4.1 (Boot 1.2), há também umSmartInitializingBean
que recebe um retorno de chamada depois que tudo foi inicializado. E existeSmartLifecycle
(da Primavera 3).fonte
CommandLineRunner
(e mais recenteApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Você pode estender uma classe usando
ApplicationRunner
, substituir orun()
método e adicionar o código lá.fonte
ApplicationReadyEvent
é realmente útil apenas se a tarefa que você deseja executar não for um requisito para a operação correta do servidor. Iniciar uma tarefa assíncrona para monitorar algo em busca de alterações é um bom exemplo.Se, no entanto, seu servidor estiver em um estado 'não pronto' até que a tarefa seja concluída, é melhor implementá-
SmartInitializingSingleton
lo, pois você receberá o retorno de chamada antes que sua porta REST seja aberta e seu servidor esteja aberto para negócios.Não fique tentado a usar
@PostConstruct
tarefas que só devem acontecer uma vez. Você receberá uma surpresa rude quando perceber que ele é chamado várias vezes ...fonte
Com configuração de mola:
fonte
Use um
SmartInitializingSingleton
feijão na primavera> 4.1Como alternativa, um
CommandLineRunner
bean pode ser implementado ou anotando um método de bean@PostConstruct
.fonte
Fornecendo um exemplo para a resposta de Dave Syer, que funcionou como um encanto:
fonte
Experimente este e ele executará seu código quando o contexto do aplicativo for totalmente iniciado.
fonte
Eu realmente gosto da sugestão de uso da
EventListener
anotação por @cahen ( https://stackoverflow.com/a/44923402/9122660 ), pois ela é muito limpa. Infelizmente, não consegui fazer isso funcionar em uma configuração do Spring + Kotlin. O que funciona para o Kotlin é adicionar a classe como um parâmetro do método:fonte
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
A melhor maneira de executar o bloco de código após o início do aplicativo Spring Boot é usar a anotação PostConstruct ou também usar o corredor de linha de comando para o mesmo.
1. Usando a anotação PostConstruct
2. Usando Bean Runner da Linha de Comandos
fonte
basta implementar CommandLineRunner para o aplicativo de inicialização por primavera. Você precisa implementar o método run,
fonte
Melhor maneira de usar CommandLineRunner ou ApplicationRunner A única diferença entre o método run () CommandLineRunner aceita matriz de cadeias e ApplicationRunner aceita ApplicationArugument.
fonte