Executar um metodo de tempo em tempo TimerTask

7 respostas
P

Olá, gostaria de criar um agendador que executasse meu método de tempo em tempo, sei que o quartz faz esse trabalho, mas pesquisei sobre o TimerTask, alguém tem um exemplo simples:

public void run() {
       if (System.currentTimeMillis() - scheduledExecutionTime() >=  MAX_TARDINESS)
               return;  // Too late; skip this execution.
       // Perform the task
}

7 Respostas

P

Consegui:

import java.util.Timer;
import java.util.TimerTask;

public class MyTimer {
	public static final long TEMPO = (1000 * 60); // atualiza o site a cada 1 minuto

	
	public static void main(String[] args) {
		System.out.println("inicio");
		Timer timer = null;
		if (timer == null) {
			timer = new Timer();
			TimerTask tarefa = new TimerTask() {
				public void run() {
					try {
						System.out.println("Teste agendador");
						//chamar metodo
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			};
			timer.scheduleAtFixedRate(tarefa, TEMPO, TEMPO);
		}
	}
}
L

vc pode usar threads.

http://www.ucb.br/prg/professores/giovanni/disciplinas/2004-1/pc/material/giovanni/threads.html

C

Onde deve ser colocada essa classe?

Eu fiz como vc mencionou que conseguiu, mas o site (no caso uma atualização no banco) não é realizada

package com.mydomain.sgs;

   import java.util.Timer;
   import java.util.TimerTask;
   import org.jboss.seam.annotations.In;


   public class MyTimer {
       public static final long TEMPO = (1000 * 60); // atualiza o site a cada 1 minuto

       public static void main(String[] args) {
           System.out.println("inicio");
           Timer timer = null;
           if (timer == null) {
               timer = new Timer();
               TimerTask tarefa = new TimerTask() {
                   @In(create=true)
                   NotasList notasList;
                   @In(create=true)
                   InutilList inutilList;
                   public void run() {
                       try {
                          for(int k=0;k<inutilList.getResultList().size();k++){
                            for(int i=0;i<notasList.getResultList().size();i++){
                                if(notasList.getResultList().get(i).getNumNf()==inutilList.getResultList().get(k).getNumNf()){
                                notasList.getResultList().get(i).setStatusSefaz(true);
                                }
                            }
                          }
                       } catch (Exception e) {
                           e.printStackTrace();
                       }
                   }
               };
               timer.scheduleAtFixedRate(tarefa, TEMPO, TEMPO);
           }
       }
   }

é preciso fazer a chamada do metodo run? ou a implementação efetua automaticamente a cada 1 minuto?

P

A cada um minuto ele roda sozinho conforme o exemplo.

C

então ele simplesmente n ta rodando…

onde ele deveria fazer

notasList.getResultList().get(i).setStatusSefaz(true);

“setando” o StatusSefaz = true não acontece.

o que pode ser?

C

a classe ta dentro do projeto .war

K

Eu geralmente confio mais no gerador de “clock” com oscilador de cristal dos computadores do que nas classes “timer” do Java para fazer esse tipo de tarefa. Um “Thread.sleep(int milissegundos)” conseguia resolver meu problema de executar uma tarefa em intervalos regulares. Tenho más experiências com as classes “timer” porque a máquina onde meu código rodava era um cliente de um servidor NTP meio doido, o que provavelmente fazia as classes “timer” se perderem completamente…

Inté.

Criado 17 de janeiro de 2008
Ultima resposta 5 de jan. de 2009
Respostas 7
Participantes 4