Problema com Shedule

4 respostas
S

Galera, tenho minha classe implementando a classe run abstrata de TimeTask, Porém meu programa roda apenas um vez, ele nao é continuo.
Alguém pode me dizer como faço para deixala continua? Para que nao pare na próxima vez em que o programa rodar?

Aqui vai meu código:

public final class TemporizadorSensores extends TimerTask {
    //varolres em milisegundos para configurar o timeTask
    private final static long diaEmMiliSeconds = 1000 * 60 * 60 * 24;
    private final static int fONE_DAY = 1;
    private final static int fFOUR_AM = 2;
    private final static int fZERO_MINUTES = 0;

    /**
     * Construtor de TimerTask e Timer.
     */
    public static void main(String args[]) {
        TimerTask temporizador = new TemporizadorSensores();

        //execute o programa todos os dias as 2 da manhã, comecando no proximo dia.
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(temporizador, getProximoDia2Manha(), diaEmMiliSeconds);
    }

    /**
     * Implementa classe abastrata run de TimeTask.
     */
    public void run() {
        Principal principal = new Principal();

        CreateLogMessage log = new CreateLogMessage();

        ReturnStringLog stringLog = new ReturnStringLog();

        EnviarEmail email = new EnviarEmail(Configuracoes.getEmailMessage());
    }

    /**
     * Metodo que retorna o dia de amanhã na hora passada,
     * neste caso estamos fazendo com que o programa seja rodado todos os dias as 2 da manhã.
     * @return dateTomorrow
     */
    private static Date getProximoDia2Manha() {
        //Cria uma data chamada tomorrow.
        Calendar tomorrow = new GregorianCalendar();
        //Adiciona nessa data, que até agora está referenciada como a data da VM,
        //os milissegundos necessários para que seja o proximo dia.
        tomorrow.add(Calendar.DATE, fONE_DAY);
        //Instancia de calendar passando como argumento o dia de amanha, na hora e minuto desejado,
        //que neste caso é as 2 da manhã.
        Calendar result = new GregorianCalendar(
                tomorrow.get(Calendar.YEAR),
                tomorrow.get(Calendar.MONTH),
                tomorrow.get(Calendar.DATE),
                fFOUR_AM,
                fZERO_MINUTES);
        //retorna uma Data para que o schedule seja rodado.
        return result.getTime();
    }
}

4 Respostas

S

Help plz!

T

Pode ser que isto esteja lançando alguma RunTimeException, se isso estiver ocorrendo o timer “pára”.

/**
     * Implementa classe abastrata run de TimeTask.
     */
    public void run() {
        Principal principal = new Principal();

        CreateLogMessage log = new CreateLogMessage();

        ReturnStringLog stringLog = new ReturnStringLog();

        EnviarEmail email = new EnviarEmail(Configuracoes.getEmailMessage());
    }
S

Nao, ele nao exibe nenhum erro. Ele roda o programa certinho, só que apenas 1 vez. Gostaria que isso fosse continuo, todos os dias as 2 da manhã por exemplo.

T

De qualquer maneira, é sempre uma boa prática capturar todas as exceções dentro do método “run” para evitar que o timer “pare”.

public void run () {
    try {
         Principal principal = new Principal();  
   
         CreateLogMessage log = new CreateLogMessage();  
   
         ReturnStringLog stringLog = new ReturnStringLog();  
   
         EnviarEmail email = new EnviarEmail(Configuracoes.getEmailMessage());        
    } catch (Throwable thr) {
        thr.printStackTrace(); // por exemplo - é claro que você tem de usar uma classe de Log como o Log4j.
    }
}
Criado 18 de junho de 2008
Ultima resposta 18 de jun. de 2008
Respostas 4
Participantes 2