2017-01-25 3 views
1

、私は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); 
} 

は私が呼んでいる私のController内部TaskExecutor

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

    return threadPoolTaskExecutor; 
} 

を作成しています方法ですが次のようなAsyncメソッド:

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

今私は取得したいキューに追加された保留中の非同期タスクの総数。どのように私はこれを得ることができますか?私はコントローラクラスで以下を試しましたが、TaskExecutorにはこの目的を果たすメソッドがありません。

@Autowire 
private TaskExecutor taskExecutor; 

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

それはまったく可能だろうと思います。保留中のタスクをカウントすると、他のすべてのスレッドをブロックする必要があるため、何らかのタスクを盗み出さないようにするか、カウントしている間に他のタスクを追加したり、その番号の*弱い/近似*を提供します。おもしろい... – Eugene

答えて

0

あなたは行うことができます:

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

しかし、それはおおよそ、これらの各メソッドは、実際にロック用ReentrantLockのを使用していますでしょう。

+0

ロックしないで他の方法はありますか? – Nayan

+0

@Nayaは本当にありません。ロックは内部で行われます。この近似はあなたのケースでは十分ではありませんか? – Eugene

+0

ええ、それで十分です。私はこれを使用するつもりです。あなたの助けをたくさんありがとう:) – Nayan

関連する問題