2017-02-04 165 views
0

我使用Spring的調度(@EnableScheduling),並具有以下@Scheduled方法,這就是所謂的每分鐘:觸發@Scheduled方法

@Component 
public class ScheduledTask { 

    @Scheduled(fixedRate = 60*1000) 
    public void run() { 
    // ... 

現在我想能夠觸發調度運行,點播,從代碼中的另一個地方。

我可以注入ScheduledTask並且只需調用run方法。但是我想確保在任何時候只有一個線程運行run方法。換句話說,如果調度程序當前正在運行run我希望呼叫被忽略。

另外我想異步調用run,但這可以通過使用@EnableAsync@Async來輕鬆解決。

在這種情況下可以使用任何Spring功能嗎?

回答

0

編輯截止日期:

只需使用AtomicBoolean即可。

@Component 
public class ScheduledTask { 

private AtomicBoolean isRunning = new AtomicBoolean(false); 

@Scheduled(fixedRate = 60*1000) 
public void run() { 
    if (isRunning.compareAndSet(false, true)) { 

     // ... do your things 

     //whenever you are done 
     isRunning.set(false); 
    } 

我不認爲在春天有更簡單的東西。這是沒有意義的,因爲它確實是一個旗幟的事情。

編輯:

如果你想在應用程序的多個地方使用它,可以考慮與嵌入信號或原子布爾實現自己的註解。

+0

此代碼不正確,因爲它包含競爭條件。如果兩個線程完全同時執行run方法會發生什麼?比方說,thread1用'if'執行這一行,這是真的,然後thread2執行同一行,這也是正確的。由於你沒有同步,所以有可能超過1個線程將運行'run'方法。我已經使用了「Semaphore」類,但在這個問題中,我問是否有任何Spring工具可以在這裏提供幫助。 –

+0

我改變使用AtomicBoolean的好點 – Fernando

+0

我認爲與AtomicBoolean你應該沒問題。那裏沒有比賽條件。 – Fernando