我应该使用Spring的TaskScheduler在@Async注释的指定时间执行任务吗?

时间:2012-05-11 11:28:41

标签: java spring spring-annotations

我在Web应用程序中使用Spring 3,我想在未来两分钟内运行一个任务(例如发送电子邮件)。可能有多个调用由不同的用户(具有不同的参数)安排相同的任务,因此会有一些调度队列重叠。

在应用程序的其他地方,我使用Spring的 @Scheduled 注释来定期执行cron样式任务,因此我已经配置了Spring's task execution and scheduling并且正在工作。因此,我的 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注释吗?如果我这样做会有什么不同?

2 个答案:

答案 0 :(得分:2)

在您的情况下没有任何区别,因为您已使用@Async注释注释了静态方法 - 并且Spring不会在此实例中创建代理。

如果您在普通的Spring bean方法上声明了@Async注释,那么行为将是内部将其包装到Runnable类中并将其作为任务提交给线程池,并且您的被调用方法将立即返回 - 而任务计划由线程池执行。

答案 1 :(得分:0)

据我所知,唯一的区别是如果你把注释调度程序执行这个任务并转到另一个任务。如果任务的执行时间超过你的间隔(2分钟) - 你会发现不同。

使用@Asunc注释调度程序将启动新任务,而无需等待前一个完成。没有这个注释,它将等到当前任务完成。

如果任务执行超过你的间隔(2分钟),那么差异就可以了。