1

私は Web アプリケーションで Spring 3 を使用しており、2 分後に 1 回タスクを実行したいと考えています (例: 電子メールの送信)。この同じタスクを異なるユーザーが (異なるパラメーターで) スケジュールするために複数の呼び出しが行われる可能性があるため、スケジュール キューが重複することがあります。

アプリケーションの他の場所では、Spring の@Scheduledアノテーションを使用して定期的に cron スタイルのタスクを実行しているため、Spring のタスクの実行とスケジューリングが既に構成され、機能しています。したがって、私のapplicationContext.xmlファイルには次のようなものが含まれています。

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor  id="myExecutor"  pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/> 

テストとして次のコードを作成しましたが、コンソールに送信された出力からは、@Asyncアノテーションを使用しても使用しなくても違いはないようです (動作は同じです)。

public static void main(String[] args) {
    ApplicationContext ctx = 
         new ClassPathXmlApplicationContext("applicationContext.xml");
    long start = System.currentTimeMillis();
    long inXseconds = start + (1000 * 10);        
    Date startTime = new Date(start + 5000);
    TaskScheduler taskscheduler = (TaskScheduler) ctx.getBean("myScheduler");

    System.out.println("Pre-calling " + new Date());        
    doSomethingInTheFuture(taskscheduler, startTime, "Hello");
    System.out.println("Post-calling " + new Date());    

    while(System.currentTimeMillis()< inXseconds){            
        // Loop for inXseconds
    }        

    System.exit(0);
}

@Async
private static void doSomethingInTheFuture(
       TaskScheduler taskscheduler, 
       Date startTime, 
       final String attribute){
    // Returns a ScheduledFuture but I don't need it
    taskscheduler.schedule(new Runnable(){
        public void run() {
            System.out.println(attribute);
            System.out.println(new Date());
        }            
    }, startTime);                        
}

私の質問は次のとおりです。

@Async アノテーションを使用する必要がありますか?使用するとどのような違いがありますか?

4

2 に答える 2

2

@Async アノテーションを使用して静的メソッドにアノテーションを付けているため、ケースに違いはありません。Spring はこのインスタンスでプロキシを作成しません。

通常の Spring Bean メソッドで @Async アノテーションを宣言した場合、動作はそれを内部的に Runnable クラスにラップし、それをタスクとしてスレッドプールに送信することであり、呼び出されたメソッドはすぐに返されます。スレッドプールによって実行されるようにスケジュールされています。

于 2012-05-11T12:30:20.223 に答える
0

私がこれを理解したように、注釈スケジューラを配置した場合の唯一の違いは、このタスクを実行して別のタスクに移動することです。タスクの実行に間隔(2分)以上かかる場合は、違いがわかります。

@Asuncアノテーションを使用すると、スケジューラーは前のタスクが完了するのを待たずに新しいタスクを開始します。この注釈がないと、現在のタスクが完了するまで待機します。

したがって、タスクの実行に間隔(2分)を超える時間がかかる場合は、違いが生じる可能性があります。

于 2012-05-11T12:18:20.113 に答える