VRaptor iniciar threads junto com a aplicação

12 respostas
D

Galera, como faço pra iniciar uma threads junto com a aplicação? estou usando o vraptor.

12 Respostas

D

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?

G

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?

D

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.

G

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/

D

obrigado pela recomendação, vou estar implementando conforme o exemplo do site, qualquer duvida volto aqui.

Valeu

D

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?

G

Vocẽ precisa colocar como ApplicationScoped para que ele inicialize junto com o vraptor. Caos contrário ele nunca será chamado.

D

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:

Lucas_Cavalcanti

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…

G

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.

D

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.

G

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.

Criado 30 de abril de 2010
Ultima resposta 4 de mai. de 2010
Respostas 12
Participantes 3