2013-03-13 139 views
1

反正是有超时计划任务(杀线程)在春季,如果任务需要长期甚至挂起,因为远程资源不可用杀春季调度线程

在我的情况下,任务可以花费太长的时间,甚至挂起是因为它们基于HtmlUnitDriver(Selenium)步骤序列,但它会不时挂起,我希望能够为要执行的线程设置时间限制。最多1分钟。

我设置5分钟的固定费率执行,初始延迟1分钟。

在此先感谢

+0

你解决这个问题? – Luciano 2013-03-15 13:47:38

回答

0

参见:How to timeout a thread

简短的答案是,有没有简单的或可靠的方式来杀死一个线程由于Java的线程执行的限制。 ExecutorService#shutdown()是一种黑客和沉重。它最好在任务本身中处理这个问题,例如就像在网络请求级别,如果您在套接字上发出REST请求超时。

或者,如果您执行某种类型的消息传递ala Actor模型(请参阅Akka),您可以发送一条来自“主管”的消息,以使Actor死亡。同时避免使用类似Netty的阻塞会有所帮助。

1

我也做了同样前段时间下面这个例子:example

的基本思想是把你的代码在一个类实现可赎回或可运行状态,然后创建一个FutureTask无论你打算用给invoque你的线程Callable或Runnable类作为参数。定义一个执行器,将你的FutureTask提交给执行器,现在你可以在try catch块中执行x时间的线程,如果你的线程以一个timeoutException结束,你会知道它花了太长时间。

这里是我的代码:

CallableServiceExecutor callableServiceExecutor = new CallableServiceExecutor(); 
     FutureTask<> task = new FutureTask<>(callableServiceExecutor); 

     ExecutorService executor = Executors.newSingleThreadExecutor(); 
     executor.submit(task); 

     Boolean exito = true; 

     try { 

      result = task.get(getTimeoutValidacion() , TimeUnit.SECONDS); 

     } catch (InterruptedException e) { 
      exito = false; 
     } catch (ExecutionException e) { 
      exito = false; 
     } catch (TimeoutException e) { 
      exito = false; 
     } 

     task.cancel(true); 
     executor.shutdown(); 
+0

非常感谢Luciano,我会试一试并回复给您 – frandevel 2013-03-16 08:30:22

+0

这里的一个重要区别是I0m使用Spring和@Async注释,所以我没有完全控制线程初始化并触发 – frandevel 2013-03-16 14:15:53

+0

但尽管如此这给了我一个关于拥有主执行程序线程,手动运行所有子线程,可能在特定时间睡眠,然后杀死仍然活着的人的线索。保持控制是在这个ppoint – frandevel 2013-03-16 14:17:51