【问题标题】:Spring Async Executor : remove from queue after x timeSpring Async Executor:x时间后从队列中删除
【发布时间】:2018-10-31 14:07:57
【问题描述】:

我在这里定义了一个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 分钟)的任务

有没有简单的方法来做到这一点?我找不到。

【问题讨论】:

    标签: java executor spring-async


    【解决方案1】:

    您可以将 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);
    }
    

    【讨论】:

    • 您的解决方案似乎解决了另一个问题,即能够取消正在运行的任务。我正在寻找的是从 queue 中删除,这意味着这些任务还没有被执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2015-04-23
    • 2016-06-22
    • 2014-02-26
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多