Olá,
Estou fazendo um sistema que deve possuir um mecanismo de timeout. O sistema tem um conjunto de “fornecedores de imagens”, e se esses fornecedores ficarem inativos por um período de tempo X (em geral, uma ou duas horas), eles devem ser desligados.
Pensei em fazer o seguinte:
-
Cada fornecedor de imagens tem um método que retorna a quantidade de tempo em que ele está inativo;
-
O sistema tem um controlador, e coloquei no controlador um método para verificar o tempo de inatividade de cada fornecedor e, se o tempo for maior que o limite, remover o fornecedor;
-
Preciso de um temporizador para ativar o método de 2) num intervalo fixo - por exemplo, a cada 10 ou 15 min.
Eu não conheço muito sobre threads, e por isso estou pedindo a ajuda de quem souber fazer isso. Eu tentei fazer da seguinte maneira:
- criei uma classe VerificadorTimeout, que transcrevo a seguir:
public class VerificadorTimeout implements Runnable {
//intervalo entre as checagens (valor inicial 10 min)
private volatile int INTERVALO = 10 * 60 * 1000;
@Override
public void run() {
while (true) {
try {
pause();
verificar();
} catch (ExcecaoLucca el) {
System.out.println("Verificacao de timeout de fornecedores " +
"nao foi bem sucedida! " + el.getMessage());
el.printStackTrace(System.out);
} catch (InterruptedException ie) {
System.out.println("Verificador de timeout de fornecedores " +
"de imagens interrompido! " + ie.getMessage());
ie.printStackTrace(System.out);
}
}
}
public synchronized void pause() throws InterruptedException {
this.wait(INTERVALO);
}
public synchronized void verificar() throws ExcecaoLucca {
Lucca.getLucca().verificarFornecedoresInativos();
}
}
- Tem um servlet que dá acesso ao sistema (a interface do sistema é muito pequena, e controlada apenas por esse servlet). Nele, criei uma variável de classe com o nome “verificador”. No método init() inicializei a variável e a thread():
verificador = new VerificadorTimeout();
new Thread(verificador).start();
- No método destroy(), anulei a variável “verificador”:
verificador = null;
Bem, a minha pergunta é a seguinte: como não tenho muito conhecimento de threads, pergunto se a classe VerificadorTimeout acima está consistente, e se pode funcionar sem erros aparentes. O que mais me deixa inseguro é a exceção InterruptedException, pois não sei em que condições ela será lançada e o que fazer em resposta. Na verdade, sei que estou ignorando as duas exceções, mas com relação a essa InterruptedException, não sei se estou procedendo corretamente. Pergunto, de modo geral, se a solução que descrevi é consistente e sem erros aparentes. Se houver outra forma, melhor, de fazer a mesma coisa, peço que me indiquem.
Obrigado por qualquer ajuda,
Hel_all