Problemas com Timer Schedule

Bom dia.

Estou tendo problemas com o schedule da classe Timer.
Tenho um serviço que deve rodar indefinidamente fazendo notificações e para isso uso o método schedule (TimerTask task, Date firstTime, long period).

Com esse disparo, ele deveria rodar indefinidamente até o alguém parar o serviço.
No entanto, ele pára sozinho em alguns dias.

Alguém pode me ajudar?
Existe alguma outra configuração que devo fazer para que ele rode sem parar?

Obrigada.

Uma TimerTask roda sob uma thread. Se alguma exceção for lançada dentro do TimerTask e não for tratada, a thread que a executa morre e a TimerTask não executa mais.

A thread é bem simples, ela é mais ou menos parecida com isto aqui:

while (...) {
     Executar a TimerTask;
     Thread.sleep (até o instante que ela deve acordar);
}

O segredo é escrever a TimerTask de modo que todas as exceções não previstas sejam tratadas, para que a exceção não tratada não mate a thread que roda a TimerTask:

.... {
     try {
         ... o código que você tinha posto na sua TimerTask
     } catch (Throwable thr) {
         Logar a exceção que você não havia previsto e que provavelmente fritou o seu scheduled timer
     }
}

[quote=entanglement] try { ... o código que você tinha posto na sua TimerTask } catch (Throwable thr) { Logar a exceção que você não havia previsto e que provavelmente fritou o seu scheduled timer } } [/quote]Era disso que eu ia falar.

Você está salvando em um log o erro? Procure por erros lá.

Se não estiver salvado nada, você terá que salvar para poder localizar o erro algum dia.

Os erros que são lançados são exibidos o StackTrace deles para investigação.
O estranho é que ela parou sem nenhuma mensagem de errro.

[quote=marina.amaralsantos]Os erros que são lançados são exibidos o StackTrace deles para investigação.
O estranho é que ela parou sem nenhuma mensagem de errro.[/quote]Mas não tem nenhuma mensagem de erro antes não? O servidor continuou em pé?

Uma coisa que ocorreu aqui foi o seguinte: o processo periódico entrou em loop e como a máquina tinha dezenas de CPUs, ninguém percebeu, porque o consumo total de CPU mal se alterou. Então o processo periodico acabou não sendo periódico porque travou - e o pior é que entrou em loop em um lugar que não havia log.

Para determinarmos que o processo havia realmente entrado em loop, tivemos que dar um kill -3 para pegar um thread dump .

Ou seja, nesse caso um “try / catch (Throwable)” não resolveria :slight_smile:

[quote=entanglement]Uma coisa que ocorreu aqui foi o seguinte: o processo periódico entrou em loop e como a máquina tinha dezenas de CPUs, ninguém percebeu, porque o consumo total de CPU mal se alterou. Então o processo periodico acabou não sendo periódico porque travou - e o pior é que entrou em loop em um lugar que não havia log.

Para determinarmos que o processo havia realmente entrado em loop, tivemos que dar um kill -3 para pegar um thread dump .

Ou seja, nesse caso um “try / catch (Throwable)” não resolveria :)[/quote]Legal. bom saber disso.

Vocês não tinham alarme para processamento de CPU?

[quote] [i] entanglement wrote:
Uma coisa que ocorreu aqui foi o seguinte: o processo periódico entrou em loop e como a máquina tinha dezenas de CPUs, ninguém percebeu, porque o consumo total de CPU mal se alterou. Então o processo periodico acabou não sendo periódico porque travou - e o pior é que entrou em loop em um lugar que não havia log.

Para determinarmos que o processo havia realmente entrado em loop, tivemos que dar um kill -3 para pegar um thread dump .

Ou seja, nesse caso um “try / catch (Throwable)” não resolveria[/i] [/quote]

Como vocês resolveram o problema?

Ora, solicitamos a correção do bug. Como tínhamos os fontes, basicamente indicamos onde corrigir - a responsabilidade de criar os pacotes com a correção é do nosso fornecedor.

Nesse caso acho que isso não seria detectado, já que tais alarmes costumam tocar quando o total consumido por todas as CPUs é que excede um determinado limite. Como um programa entrando em loop em uma única thread acabaria (no nosso caso de 24 CPUs) gastando o correspondente a 1/24 a mais, nem dá para detectar isso sem desconfiar do que poderia estar ocorrendo.

Pessoal, ainda não consegui resolver o meu problema.
Todo o código da TimerTask está isolado em try/catch e também não tenho erro aparente no log.

O serviço (desenvolvido internamente) na verdade não termina, mas sim pára de trabalhar.
Alguém tem alguma sugestão?

Obrigada.