我在这里定义了Executor
:
@Bean("asyncExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(appConfigProperties.getThreadpoolCorePoolSize());
executor.setMaxPoolSize(appConfigProperties.getThreadpoolMaxPoolSize());
executor.setQueueCapacity(appConfigProperties.getThreadpoolQueueCapacity());
executor.setThreadNamePrefix("threadPoolExecutor-");
executor.initialize();
return executor;
}
我希望能够删除队列中停留时间超过X分钟的任务(X分钟未处理)
有没有简单的方法可以做到这一点?我找不到任何东西。
答案 0 :(得分:0)
您可以将ThreadPoolTaskExecutor包装在一个自定义类中,该类将安排任务状态的验证,如果未完成,则将其取消。
public class CancellingExecutor implements Executor {
private final ExecutorService delegate;
private final ScheduledExecutorService monitoringExecutor;
public CancellingExecutor(final ExecutorService delegate,
final ScheduledExecutorService monitoringExecutor) {
this.delegate = delegate;
this.monitoringExecutor = monitoringExecutor;
}
@Override
public void execute(final Runnable command) {
Future<?> future = delegate.submit(command);
monitoringExecutor.schedule(() -> {
if (!future.isDone() && !future.isCancelled()) {
future.cancel(false);
}
}, 1, TimeUnit.MINUTES);
}
}
配置如下所示:
@Bean("asyncExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(appConfigProperties.getThreadpoolCorePoolSize());
executor.setMaxPoolSize(appConfigProperties.getThreadpoolMaxPoolSize());
executor.setQueueCapacity(appConfigProperties.getThreadpoolQueueCapacity());
executor.setThreadNamePrefix("threadPoolExecutor-");
executor.initialize();
ScheduledExecutorService monitoringExecutor = Executors.newScheduledThreadPool(1);
return new CancellingExecutor(executor, monitoringExecutor);
}