[Resolvido]VRaptor - Problemas com Thread

7 respostas
Rafael_Guerreiro

Boa noite!

Eu tenho uma aplicação que, assim que ela inicia e o VRaptor executa a minha classe que constrói a SessionFactory, eu abro uma Thread para que ela verifique uma informação no banco todos os dias as 6 da manhã. Então ela fica dormindo até que seja 6 da manhã.

Ela é acionada á partir da minha SessionFactoryProvider (@ApplicationScoped).

Eu percebi que quando somente o sistema sofre um reload (temos outros sistemas no mesmo tomcat, e eles não sofrem o reload) essa thread não vai embora, ela fica viva. E ai, se o banco de dados tem a senha alterada, ela vai tentar acessá-lo com a senha antiga. E ai o usuário do banco trava.

Como que eu faço para que a thread morra junto com a aplicação? Eu pensei em fazê-la @ApplicationScoped também, mas não faz muita diferença, pois eu preciso que o sistema fique funcionando normalmente enquanto a thread só espera a hora dela.

7 Respostas

Lucas_Cavalcanti

tenta fazer isso num método anotado com @PreDestroy

Rafael_Guerreiro

Eu faço ela com Thread mesmo e anotada com @ApplicationScoped mesmo? Ai no @PreDestroy eu mato a Thread?

Ou isso é no @PreDestroy da SessionFactoryProvider?

Lucas_Cavalcanti

PreDestroy da classe que inicia a thread…

se vc está fazendo o busy wait na mão, considere usar o ScheduledThreadPoolExecutor que já vem de graça no java 6 :wink:

algo como:

ScheduledExecutorService service = Executors.newScheduledThreadPool(1);

//na hora de iniciar as coisas:
service.scheduleAtFixedRate(suaThread, TimeUnit.HOURS, 4);
//no predestroy:
service.shutdown();
Rafael_Guerreiro

Hmmm… Gostei bastante desse ScheduledThreadPoolExecutor.

Quando eu for mexer nesse projeto (acho que ainda hoje) eu o implemento.

Esse TimeUnit, pelo o que eu vi na documentação, não tem HOUR, só vai até SECOND… (mas nenhum problema nisso, é só multiplicar por 3600 e está tudo certo.)
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/TimeUnit.html

Lucas_Cavalcanti

no java 6 tem :wink:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html

Rafael_Guerreiro

:lol:
Eu estou com o Java 6 aqui. Os métodos mudam um pouquinho também.

Rafael_Guerreiro

Muito obrigado Lucas.

Funcionou bem demais!

Criado 7 de agosto de 2012
Ultima resposta 3 de set. de 2012
Respostas 7
Participantes 2