我在 Web 应用程序中使用 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 注释吗?如果我这样做会有什么不同?