1

我在 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 注释吗?如果我这样做会有什么不同?

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 回答