Я использую Spring 3 в веб-приложении и хочу запустить задачу через две минуты в будущем (например, отправить электронное письмо). Может быть несколько вызовов для планирования одной и той же задачи разными пользователями (с разными параметрами), поэтому будут некоторые перекрытия очередей планирования.
В другом месте приложения я использую аннотацию 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 и какая разница, если я это сделаю?