Executar método em um intervalo de tempo definido

15 respostas
T

Olá, tenho que executar um método acada 5 ou 10 minutos em um projeto java JSF, alguém tem uma dica de como fazer isso?

15 Respostas

W

O Java oferece a classe abstrata TimerTask para você especializar a sua classe com a rotina e o intervalo entre ciclos de execuções.

Veja um exemplo em http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/timer.html

wiliamps

H

Com JSF tem esse cara que é muito simples de usar: http://www.primefaces.org/showcase/ui/poll.jsf

R

Nossa, tô a um bom tempo trabalhando com JSF já e não conhecia esse cara (valeu pela dica). Ele é novo?

H

Nossa, tô a um bom tempo trabalhando com JSF já e não conhecia esse cara (valeu pela dica). Ele é novo?Não sei te falar com precisão quando esse componente foi criado, mas sei que é bastante útil para esse tipo de requisito.

R

Ah sim, agora se ele precisar que essa ação seja executada mesmo enquanto ele navega, pode ser melhor utilizar um TimerService, né? Se ele estiver usando EJBs.

H

Ah sim, agora se ele precisar que essa ação seja executada mesmo enquanto ele navega, pode ser melhor utilizar um TimerService, né? Se ele estiver usando EJBs.Uhum.

O único problema que vejo seria integra-lo com a view. No saco desse componente do JSF caso a página fosse fechada ele não seria mais executado. Sem a página estar aberta o timer seria disparado. Outras soluções para rodar a rotina sem precisar da página aberta é o próprio timer citado acima, o timer do ejb (que você falou) ou até mesmo o quartz. Conhece o quartz?

T

Vê se é isso que vc quer!

public static void main(String[] args) throws ParseException {
	
		TimerTask task = new TimerTask() {
			
			@Override
			public void run() {
				System.out.println(new Date());
				
			}
		};
		
		Timer t = new Timer();
		t.schedule(task, 1, 2000);//executa a task passada como argumento 1 ms após iniciar a cada 2 seg;
		
		 
	}

P.S.: Ahahahaha to com sono e não li que era em JSF :oops:, sei que o A4J, agora richfaces também possui algo parecido!

R

Hebert Coelho:
Uhum.

O único problema que vejo seria integra-lo com a view. No saco desse componente do JSF caso a página fosse fechada ele não seria mais executado. Sem a página estar aberta o timer seria disparado. Outras soluções para rodar a rotina sem precisar da página aberta é o próprio timer citado acima, o timer do ejb (que você falou) ou até mesmo o quartz. Conhece o quartz?

Já ouvi falar do Quartz sim, mas como eu trabalho com EJBs, sempre achei mais fácil usar diretamente o TimerService que já vem junto :slight_smile:

Já que estamos em um post sobre o assunto, você tem alguma preferência entre os 2?

C

Se estiver usando EJB (Que seria uma das melhores formas de se fazer), você pode usar a anotação @Schedule.

Exemplo:

@Schedule(second = "*/10", minute = "*", hour = "*", persistent = false) public void tarefa(){ System.out.println("Executando a cada 10 segundos"); }

H

Rodrigo Sasaki:
Hebert Coelho:
Uhum.

O único problema que vejo seria integra-lo com a view. No saco desse componente do JSF caso a página fosse fechada ele não seria mais executado. Sem a página estar aberta o timer seria disparado. Outras soluções para rodar a rotina sem precisar da página aberta é o próprio timer citado acima, o timer do ejb (que você falou) ou até mesmo o quartz. Conhece o quartz?

Já ouvi falar do Quartz sim, mas como eu trabalho com EJBs, sempre achei mais fácil usar diretamente o TimerService que já vem junto :slight_smile:

Já que estamos em um post sobre o assunto, você tem alguma preferência entre os 2?

Cara um tem sua vantagem e desvantagem:

  1. Quartz: É uma api pequena mas muito funcional. Toda vez que o servidor for iniciado as tarefas serão iniciadas. Pode rodar com qualquer servidor.
  2. EJB: É boa e já permite integração com as transações do banco de dados. O problema é que não roda em qualquer servidor.
C

Então, mas ele disse que usa EJB, não deve ser algo bobinho, e já que usa EJB, @Schedule nele !! rsrsrs

H

Cesar Pizolato:
Então, mas ele disse que usa EJB, não deve ser algo bobinho, e já que usa EJB, @Schedule nele !! rsrsrs
Ele quem?

R

Ele falou que usa JSF, não EJB

C

Ele falou que usa JSF, não EJB

Hehehehe eu li o Rodrigo falando que usa EJB e acabei confundindo as pessoas, desculpem :slight_smile:

T

Ai galera obrigado pelas dicas ai vou começar a testa elas aqui. Estou usando o primeface mas vou testa o poll que Hebert Coelho indicou e o time e classe TimerTask que wiliamps indicou, esse método tem que continuar rodando mesmo se o navegador for fechado. Valeu pela ajuda.

Criado 8 de novembro de 2012
Ultima resposta 8 de nov. de 2012
Respostas 15
Participantes 6