私は 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 アノテーションを使用する必要がありますか?使用するとどのような違いがありますか?