Criar uma TimerTask que aborte um metodo,caso ele não tenha acabado sua execução em 20s

10 respostas
K

Boa tarde, pessoal.

Criei uma TimerTask que verifica em 20 segundos se meu cadastrarPessoas deu o retorno esperado.
O problema é que caso o tempo de execução exceda estes 20 segundos eu preciso parar eu preciso sair
do meu metodo cadastrarPessoas(), porém isto dentro do metodo run não é possivel.

Timer   timer = new Timer();   
	          TimerTask tarefa = new TimerTask() {   
	                public void run()  {   
	                    System.out.println("Agendador startado");
	                	if(retornoMetodo=null)  
	                        // parar a execução do metodo  aqui já tentei o break 
	                       // e oreturn não funcionou.
}   
	            };   
	            timer.scheduleAtFixedRate(tarefa, delayWebService, delayWebService);

A possibilidade de colocar a parte de cadastro dentro de uma thread está descartada, por que eu perderia todas as exceções que podem ser lançadas na operação.
Agradeço qualquer sugestão.

10 Respostas

Foxlol

E se vc lançar uma exceção de dentro do método run()?

E capturar com um try catch por fora e fazer o que quer fazer?

Posta mais código aí para ver de onde vc chama a task talz.

Flw

ViniGodoy
Sua timer task terá que parar o timer.
final Timer   timer = new Timer();     
TimerTask tarefa = new TimerTask() {     
   public void run()  {     
      System.out.println("Agendador startado");  
      if(retornoMetodo=null) {
          timer.cancel();
          return;
      }
   }     
};     

timer.scheduleAtFixedRate(tarefa, delayWebService, delayWebService);
maior_abandonado

a unica forma que eu imagino de fazer isso é usando threads…

para capturar alguma exceção, teria como você ter a classe herdando thread que faça o processamento no método run e, tendo um atributo trouable, seta-lo com a exceção que ocorrer, se ocorrer, caso contrario deixa-lo nulo.

ai depois de feita a execução você verifica se o atributo troable da instancia usada da sua classe extends thread esta nulo.

outra coisa também, atualmente você esta aguardando 20 segundos antes de verificar se deu tudo certo, ao invés disso, na thread que starta a thread faz o processamento você da um wait(20000) ao invés de aguardar sempre os 20 segundos e, depois de terminado o processamento (mesmo que com exceção) essa thread devedar um notify na outra que está esperando…

funciona pro que você quer… ao menos pro que eu intendi que você quer…rs

panngo

Kiev:
Boa tarde, pessoal.

Criei uma TimerTask que verifica em 20 segundos se meu cadastrarPessoas deu o retorno esperado.
O problema é que caso o tempo de execução exceda estes 20 segundos eu preciso parar eu preciso sair
do meu metodo cadastrarPessoas(), porém isto dentro do metodo run não é possivel.

Timer   timer = new Timer();   
	          TimerTask tarefa = new TimerTask() {   
	                public void run()  {   
	                    System.out.println("Agendador startado");
	                	if(retornoMetodo=null)  
	                        // parar a execução do metodo  aqui já tentei o break 
	                       // e oreturn não funcionou.
}   
	            };   
	            timer.scheduleAtFixedRate(tarefa, delayWebService, delayWebService);

A possibilidade de colocar a parte de cadastro dentro de uma thread está descartada, por que eu perderia todas as exceções que podem ser lançadas na operação.
Agradeço qualquer sugestão.

Testou assim?

Timer   timer = new Timer();   
	          TimerTask tarefa = new TimerTask() {   
	                public void run()  {   
	                    System.out.println("Agendador startado");
	                	if(retornoMetodo=null)  
	                        cancel();
}   
	            };   
	            timer.scheduleAtFixedRate(tarefa, delayWebService, delayWebService);
D

O cancel só vai cancelar o TimerTask eu acho.

K

O cancel neste cancela o timer Task, não o metodo.
Obrigado.

Foxlol
ViniGodoy:
Sua timer task terá que parar o timer.
final Timer   timer = new Timer();     
TimerTask tarefa = new TimerTask() {     
   public void run()  {     
      System.out.println("Agendador startado");  
      if(retornoMetodo=null) {
          timer.cancel();
          return; //Desnecessário?
      }
   }     
};     

timer.scheduleAtFixedRate(tarefa, delayWebService, delayWebService);

Ele não quer apenas cancelar o timer, ele quer abortar o método.

Lançar a exceção não resolve?

Posta mais do teu código ai para ter mais idéia do escopo das coisas.

Flw

sergiotaborda

Vc precisa usar um executor e Future

public String fazOuEspira(final Object target ) {

FutureTask<String> future = new FutureTask<String>(
       new Callable<String>() {
         public String call() {
           return oMetodoQueFazAlgo(target);
       }});
     executor.execute(future);

return  future.get(2,TimeUnit.SECOND);

}

Future tem um método get com timeout porque ele server exactamente para isto.

Sem gambiarra.

Ou mais simples ainda

ScheduledThreadPoolExecutor executor;

public String fazOuEspira(final Object target ) {

Future future = executor.submit(new Callable<String>() {
         public String call() {
           return oMetodoQueFazAlgo(target);
       }})
);

return  future.get(2,TimeUnit.SECOND);

}
Foxlol

sergiotaborda:
Vc precisa usar um executor e Future

public String fazOuEspira(final Object target ) {

FutureTask<String> future = new FutureTask<String>(
       new Callable<String>() {
         public String call() {
           return oMetodoQueFazAlgo(target);
       }});
     executor.execute(future);

return  future.get(2,TimeUnit.SECOND);

}

Future tem um método get com timeout porque ele server exactamente para isto.

Sem gambiarra.

Ou mais simples ainda

ScheduledThreadPoolExecutor executor;

public String fazOuEspira(final Object target ) {

Future future = executor.submit(new Callable<String>() {
         public String call() {
           return oMetodoQueFazAlgo(target);
       }})
);

return  future.get(2,TimeUnit.SECOND);

}

Que firmeza…nunca tinha visto essas classes FutureTask e ScheduledThreadPoolExecutor.

Vivendo e aprendendo :lol:

K

Eu configurei o TimeOut dele para uma segundo, ela o lança a exceção depois de um segundo, mas continua executando o metodo, tentei future.cancel(true).
Não funcionou.
Muito obrigado e agradeço qualquer outra sugestão que vcs possam dar.

Criado 17 de novembro de 2009
Ultima resposta 18 de nov. de 2009
Respostas 10
Participantes 7