2017-04-15 61 views
2

我正在使用Spring和Hibernate開發Java REST Web服務。我需要實現一項功能來安排未來的任務。例如,當用戶在我的應用程序中註冊時,我必須在他的賬戶中爲他的前六個月記入100個虛擬積分。像這樣,還有一些更類似的功能。如何在Spring Web Service中實現計劃任務?

我想像TimerTask可以用於此功能。問題是,如果我爲每個註冊的用戶創建了Timer,我無法停止特定用戶的Timer,如果他變爲不活動狀態並且看起來像在內存中轉儲線程。如果有1000個用戶註冊,將會有1000 TimerTask線程。

如何使用Spring或Java實現這種功能?我應該完全控制線程,我可以停止線程如果我想。

+0

,你一定程序運行這麼久,而無需重新啓動或發生故障強制重啓?我認爲你需要一個解決方案來存儲這些數據,並定期檢查定時條件。 –

+0

是的。我正在使用Tomcat服務器。它會在某個時候崩潰,然後停下來,然後我需要重新啓動服務器才能恢復。 – Mdumanoj

+0

請參閱https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html – rvit34

回答

0

您可以使用單線程執行帶有@scheduled註釋和最小XML配置的任務,我將離開您的鏈接reference

你只是需要創建在您的服務的方法,並把@Scheduled註釋像

@Scheduled(cron = "0 15 10 15 * ?") 
public void scheduleTaskUsingCronExpression(){ 
long now = System.currentTimeMillis()/1000; 
System.out.println("schedule tasks using cron jobs - " + now); 
} 
+0

是的,通過使用此功能,我可以安排工作。但是我怎麼能阻止這份工作。如果我安排Job每10分鐘執行一次,並由於某些原因我想停止執行,那我該怎麼做? – Mdumanoj

+0

不要試圖阻止工作!而是在計劃任務內部進行布爾檢查!你可以改變布爾變量來停止和啓動服務...請注意,並接受我的答案,如果它的工作! –

+0

我不認爲這是正確的做法。因爲實際上'TimerTask'正在運行,它將永遠運行。 – Mdumanoj