2011-09-13 73 views
0

我有一個應用程序檢查互聯網上的資源是否有新的郵件。如果有新郵件,它會對它們進行一些處理。這意味着根據郵件數量的不同,可能需要幾秒鐘的時間處理。調度任務,確保任務正在執行

現在執行處理的對象/程序已經是單例。所以現在我已經照顧到了那裏只有一個實例正在處理檢查和處理。

但是我現在只運行一次,我想不斷運行,每隔10分鐘或多或少地檢查一次新郵件以及時處理它們。

我明白我可以用Timer/Timertask來處理這個問題,甚至更好,我在這裏找到了一個資源:http://www.ibm.com/developerworks/java/library/j-schedule/index.html使用Scheduler/SchedulerTask。但是我擔心的是,如果我將它設置爲每10分鐘運行一次並且前一個會話正在處理數據,它會將新任務放入一個堆棧中,等待上一個任務完成後執行。所以我害怕的是例如第一次運行5小時,然後,因爲它一直很忙,之後它會在彼此檢查郵件和/或郵件後立即啓動5 * 6-1 = 29運行,做一些處理而不讓服務器休息一下。

有誰知道我該如何解決這個問題?

P.S.現在我的應用程序設置的方式是我在我的tomcat服務器上使用Java Servlet,該服務器在服務器啓動時啓動,它創建我的主程序的Singleton實例,然後調用一些方法執行提取/處理。我想要的是重複每一個「x」時間(10分鐘左右)的讀取/處理,確保實際上只有一個實例正在這樣做,並且在每次運行10分鐘左右之後真正停止。

+0

你爲什麼不嘗試基於事件的方法;因此您的調度程序類將啓動可能需要不同時間的任務;在啓動此任務時,它還會註冊一個偵聽器,在偵聽器上它將偵聽進程完成事件;現在當變量持續的郵件處理任務完成時,調度程序將被通知。然後,調度程序可以在10分鐘後排入另一個任務以觸發。這也將確保不必要的任務不在任務隊列上排隊。 – Scorpion

回答

1

實際上,Timer + TimerTask可以很好地處理這個問題。如果你安排了一些事情Timer.scheduleAtFixedRate()你會注意到文件說它會試圖「彌補」遲到的事件來維持長期的執行。但是,這可以通過使用TimerTask.scheduledExecutionTime()來克服。其中的示例讓您能夠確定任務是否太遲而無法運行,並且您可以返回而不是執行任何操作。實際上,這將「清除隊列」TimerTask。

值得注意的是:TimerTask使用單線程來執行,所以它不會並行產生任務的兩個副本。

在旁註部分,您不必一次處理隊列中的所有10k電子郵件。我建議使用TimerTask.scheduledExecutionTime()來處理一段固定的時間,以確定你有多久,然後返回。這樣可以使進程更加靈活,清理運行之間的堆棧,並且如果您正在執行集合,則確保您不必重新生成太多數據,例如,如果服務器在任務中間重新啓動。但這個建議是基於一般性的,因爲我不知道你在做什麼:)