Spring Async Executor:X时间后从队列中删除

时间:2018-10-31 14:07:57

标签: java executor spring-async

我在这里定义了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分钟未处理)

有没有简单的方法可以做到这一点?我找不到任何东西。

1 个答案:

答案 0 :(得分:0)

您可以将ThreadPoolTask​​Executor包装在一个自定义类中,该类将安排任务状态的验证,如果未完成,则将其取消。

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);
}