Como executar um método depois da inicialização do VRaptor 4?

Olá pessoal, 

Uma das grandes dúvidas que eu me deparei ao trabalhar em diversos projetos o VRaptor 4 como base, é que eu sempre ficava um pouco perdido na hora de precisar executar um método logo depois da inicialização do mesmo.

Depois de me bater um bom tempo, de falhar ao tentar fazer componentes com escopo de aplicação (@ApplicationScope), ou então de fazer um interceptor que irá rodar até algum determinado objeto estiver ‘!= null’, acabei me deparando com um cara chamado VRaptorInitialized.

Este cara é um evento que é notificado assim que todos os componentes foram inicializados, ou seja, depois do escaneamento dos controladores, interceptadores, componentes, etc.  Para sabermos o momento de executarmos a nossa lógica, vamos ter que usar um cara do CDI que é um pouco desconhecido (pra mim pelo menos), os observadores (@Observes).

Um observador basicamente irá observar o momento em que um dado objeto de seu interesse muda de estado, para que então dispare uma notificação à quem o está observando, e, neste caso a nossa lógica qualquer.

Para usar é bem simples, nós basicamente precisamos criar uma classe qualquer que seja anotada com um @ApplicationScope e que tenha um método que possua a seguinte assinatura:

Abaixo deixei um pequeno exemplo de como ficaria a implementação.

Uma pequena ressalva sobre o uso deste tipo de solução…

Evitem de usar recursos que não sejam gerenciados pelo CDI (que não possam ser providos por exemplo…), fazer conexões com o banco também não é uma boa…e por aí vai.

Para os meus casos, eu eventualmente uso para iniciar uma task do Quartz para limpar alguns temporários do Tomcat em ambientes onde há um grande número de upload de arquivos, e como é sabido, o Tomcat as vezes não faz esta limpeza.

E pronto, agora você já pode fazer executar alguma lógica depois que a sua aplicação com VRaptor 4 tenha iniciado.

Abraços.