如何使用 ThreadPoolTaskExecutor 为任务设置超时
Posted
技术标签:
【中文标题】如何使用 ThreadPoolTaskExecutor 为任务设置超时【英文标题】:How to set timeout for task using ThreadPoolTaskExecutor 【发布时间】:2017-04-27 06:07:56 【问题描述】:使用ThreadPoolTaskExecutor
时是否可以使任务超时?我无法将ThreadPoolTaskExecutor
更改为ThreadPoolExecutor
或ExecutorService
。
【问题讨论】:
使用Future.get(long, TimeUnit)
?
【参考方案1】:
在向您的ThreadPoolTaskExecutor
提交Callable
后,您应该会收到Future
。在这个Future
上,您可以使用TimeUnit
调用get(long timeout, TimeUnit unit)
函数,这是超时,程序将等待未来交付或继续运行的最长时间,通过抛出TimeoutException
。
ie(未经证实的伪代码)
Future myFuture = threadPoolTaskExecutor.submit(myCallable);
try
myResult = myFuture.get(5l,TimeUnit.SECONDS);
catch(TimeoutException e)
// Timeout-Related stuff here
【讨论】:
【参考方案2】:请参阅下面的 Git hub 链接以获取 TimeOutThreadPoolTaskExecutor
https://github.com/vivek-gupta-21563/timeoutthreadpool
您可以执行或提交带有首选超时参数的任务
execute(() -> System.out.println("Task to execute"), 2, TimeUnit.Minute);
submit(() -> System.out.println("Task to execute"), 2, TimeUnit.Minute);
【讨论】:
以上是关于如何使用 ThreadPoolTaskExecutor 为任务设置超时的主要内容,如果未能解决你的问题,请参考以下文章
具有小队列容量的 ThreadPoolTaskExecutor 阻塞调用线程?
Spring ThreadPoolTask Executor自动装配不同的实例
ThreadPoolTask Scheduler不适用于线程池
ThreadPoolTask Executor中corePoolSize和maxPoolSize的理想值应该是什么
logback 不会将异常记录到从 ThreadPoolTaskExecutor 池线程抛出的文件中
OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTaskExecutor 和多个 pod