2012-05-11 16 views
1

我在Web应用程序中使用Spring 3,我想在未来两分钟运行一次任务(例如发送电子邮件)。可能有多个调用由不同的用户(使用不同的参数)来调度相同的任务,所以会有一些调度队列重叠。我应该使用Spring的TaskScheduler在@Async注释的指定时间执行任务吗?

别处在我使用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

它在你的情况下并没有什么不同,因为你已经用@Async注释标注了一个静态方法 - 并且Spring不会在这个实例中创建一个代理。

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

+0

谢谢Biju。那么,它会有点类似于双字符串的转义?例如。产生一个线程产生到另一个线程 –

0

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

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

因此,如果任务执行需要的时间超过您的间隔(2分钟),那么区别就可能不同。

相关问题