Galera, como faço pra iniciar uma threads junto com a aplicação? estou usando o vraptor.
VRaptor iniciar threads junto com a aplicação
12 Respostas
Ja tentei criar um servlets, anotei com @Resource, pois a classe que vou chamar tem dependencia, e chamei o metodo que tem a thread dentro do metodo init(), tambem coloquei no web.xml onde mapeei o servlet o load-on-startup com valor 10, mais esta dando erro de nullpointer exception, acredito que o servlet esta iniciando primeiro que o vraptor.
Alguem tem alguma sugestão?
Eu nunca ví alguém precisar de uma thread em um servlet. Até porque isso não é uma prática aconselhada. Mas porque você precisa de uma thread? Não pode ser um JDK TImer ou um EJB Scheduler?
Na verdade eu preciso iniciar um processo quando a aplicação iniciar e esse processo roda a cada cinco minutos, eu fiz uma thread que chama um metodo que processa a informação a cada cinco minutos, agora se é a forma correta eu não sei.
Sei que preciso iniciar esse processo de alguma forma quando a aplicação iniciar.
Recomendo então você usar um JOB. Ja que você usa Vraptor, siga as dicas dessa receita no site do vraptor: http://vraptor.caelum.com.br/cookbook/job-scheduling-com-vraptor3-e-spring/
obrigado pela recomendação, vou estar implementando conforme o exemplo do site, qualquer duvida volto aqui.
Valeu
Vi o cookbook, e implementei o código de exemplo que estava lá.
No meu caso eu precisaria de um component @ApplicationScoped, mais as dependências do objeto que eu tenho que chamar é @RequestScoped, então não daria para estar utilizando nesse caso, implementei a minha Task em @RequestScoped mais ela nunca é iniciada.
Aqui esta o meu codigo:@Component
@RequestScoped
public class TaskMetaEnvioEmail implements RequestTask {
private final MetaService metaService;
public TaskMetaEnvioEmail(TaskScheduler scheduler, MetaService metaService){
this.metaService = metaService;
this.schedule(scheduler);
System.out.println("requisitou Task");
}
@Override
public void schedule(TaskScheduler scheduler) {
Calendar now = GregorianCalendar.getInstance();
now.add(Calendar.MINUTE,5);
scheduler.schedule(this, now.getTime());
}
@Override
public void run() {
System.out.println("Iniciando envio de email: " + Calendar.getInstance());
metaService.theadEnviarEmail();
System.out.println("Email enviado em: " + Calendar.getInstance());
}
}
O metodo theadEnviarEmail(), faz umas consultas no banco e algumas lógicas, mais ele não esta sendo chamado.
Alguma dica?
Vocẽ precisa colocar como ApplicationScoped para que ele inicialize junto com o vraptor. Caos contrário ele nunca será chamado.
Mais ai que esta o problema, as dependências desse metodo, são @RequestScoped, não consegui uma forma de fazer diferente. Se eu chamar colocar a chamada do metodo como @AplicationScoped da esse erro:
olá,
se vc quer que algo execute no começo da aplicação, crie um @ApplicationScope que tem um método anotado com @PostConstruct… o que estiver dentro desse método será executado no startup do vraptor…
qto ao applicationScoped precisar de um @RequestScoped, vc não vai conseguir fazer essa dependencia funcionar…
do que ele precisa? de um dao?
se sim, receba uma SessionFactory no construtor e controle a sessão na mão…
Vejo isso com um erro de desenho nesse caso. Como você quer anexar um objeto de requisição que comece com a aplicação? Os contextos application e request são independentes e não devem ser misturados.
Se você quer uma thread que seja executada no inicio da aplicação, ela é application-scoped e nesse caso não haverá requisição envolvida. Acho que você deve repensar melhor a forma que você está trabalhando e modificar algo.
Tive que deixar essa funcionalidade de lado por enquanto, mais vou voltar em seguida assim que terminar outra atividade.
O que acontece é que tenho que fazer uma thread que começa quando o sistema inicia, essa thread entre algumas regras de negócio faz uma consulta no banco a cada cinco minutos, se determinada situação não estiver sido resolvida, então faço um update.
Eu não achei uma solução para isso, pois nesse caso teria que ser uma @RequestScoped que inicia junto com a aplicação.
Nesse caso te aconselho então a usar um quartz scheduler que inicializa com a aplicação, porém o scheduler é request-scoped.
Sua classe application-scoped apenas irá inicializar o scheduler do quartz.