2012-05-11 67 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分鐘),那麼區別就可能不同。

相關問題