如何在春季获得待定的异步任务计数?

时间:2017-01-25 13:18:18

标签: java spring

在我的spring应用程序中,我在myService中使用了Async方法,如下所示:

@Async("threadPoolTaskExecutor")
public void exportObject(String id) {
    System.out.println("exporting " + id);
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("exported " + id);
}

以下是我创建TaskExecutor bean

的方法
@Bean(name = "threadPoolTaskExecutor")
public TaskExecutor getTaskExecutor() {
    ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    threadPoolTaskExecutor.setCorePoolSize(5);
    threadPoolTaskExecutor.setMaxPoolSize(5);

    return threadPoolTaskExecutor;
}

在我的Controller内,我正在调用Async方法,如下所示:

for(int i = 0; i < 100; i++){
    myService.exportObject(i+"");
}

现在,我想获取已添加到队列的待处理异步任务的总数。我怎么能得到这个?我在我的控制器类中尝试了以下操作,但TaskExecutor没有用于此目的的方法。

@Autowire
private TaskExecutor taskExecutor;

public int getPendingTaskCount(){
    // taskExecutor.getPendingTaskCount(); // ?
}

1 个答案:

答案 0 :(得分:2)

可以做:

long result = threadPoolTaskExecutor.getThreadPoolExecutor().getTaskCount() -
              threadPoolTaskExecutor.getThreadPoolExecutor().getCompletedTaskCount();

但这将是一个近似值,并且每个方法实际上都使用ReentrantLock进行锁定。