如果Spring Scheduled执行在某个固定时间后挂起,则停止

我已经使用Spring框架Scheduled将我的工作安排为使用cron每5分钟运行一次。但是有时候我的工作会无限期地等待外部资源,我无法在那里超时。我无法使用fixedDelay先前的流程,有时无法进入无限等待模式,因此我必须每5分钟刷新一次数据。

所以我一直在寻找Spring Framework的任何选项来在Scheduled进程fixed-time成功运行或失败后停止该进程/线程。

我发现以下设置是我在课堂上ThreadPoolExecutor以120秒初始化的。谁能告诉我这项工作会按我预期的那样进行。keepAliveTime``@Configuration

@Bean(destroyMethod="shutdown")

public Executor taskExecutor() {

int coreThreads = 8;

int maxThreads = 20;

final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(

coreThreads, maxThreads, 120L,

TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()

);

threadPoolExecutor.allowCoreThreadTimeOut(true);

return threadPoolExecutor;

}

回答:

我不确定这是否会按预期工作。实际上,keepAlive是用于IDLE线程的,并且我不知道您等待资源的线程是否在IDLE中。此外,仅当线程数大于内核数时,除非监视线程池,否则您无法真正知道何时发生。

keepAliveTime-当线程数大于内核数时,这是多余的空闲线程将在终止之前等待新任务的最长时间。

您可以执行以下操作:

public class MyTask {

private final long timeout;

public MyTask(long timeout) {

this.timeout = timeout;

}

@Scheduled(cron = "")

public void cronTask() {

Future<Object> result = doSomething();

result.get(timeout, TimeUnit.MILLISECONDS);

}

@Async

Future<Object> doSomething() {

//what i should do

//get ressources etc...

}

}

不要忘记添加 @EnableAsync

无需@Async实现Callable 也可以执行相同的操作。

编辑:请记住,它将等待直到超时,但是运行任务的线程不会被中断。发生TimeoutException时,您将需要调用Future.cancel。并在任务中检查isInterrupted()以停止处理。如果要调用api,请确保已选中isInterrupted()。

以上是 如果Spring Scheduled执行在某个固定时间后挂起,则停止 的全部内容, 来源链接: utcz.com/qa/406923.html

回到顶部