2013-02-22 103 views
1

我有一個方法,在具有@Scheduled註釋春任務執行不點火,直到前面的任務完成

@Scheduled(cron = "* * * * * *") 
public void doSomething() { 

} 

這應該每秒執行一次(假設cron語句是正確的)的一類。

我有消費滿配置設置爲

<task:scheduler id="taskScheduler" pool-size="2" /> 
<task:executor id="taskExecutor" pool-size="2" /> 
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" /> 

的問題是,直到最後執行完成的方法將不會再次觸發。我期待着看到它發生了兩次火災(可能開始在某處填寫工作隊列)。

如何刪除方法調用之間的依賴關係,但仍然確保一次只有2個進程runninig。

+0

這是這裏解釋: https://stackoverflow.com/questions/13197904/why-does-spring-task-scheduler-wait-for-previous-task-to-finish – VivekJ 2017-10-05 14:45:04

回答

0

這似乎是一個想法是過去的實際工作中去,TaskExecutor

@Scheduled(cron = "* * * * * *") 
public void doSomething() { 
    this.executor.execute(new Runnable() {...} 
} 

然後添加一個拒絕策略爲* CALLER_RUNS *

<task:scheduler id="taskScheduler" pool-size="1" /> 
<task:executor id="taskExecutor" pool-size="1" 
    queue-capacity="1" rejection-policy="CALLER_RUNS" /> 
<task:annotation-driven executor="taskExecutor" 
    scheduler="taskScheduler" /> 

因此,與上述情況,工作總是做由一個線程池。

不知道這是否是你最好的方式。

-1

你可以嘗試使用@ScheduledfixedRate - 值,而不是cronfixedDelay

固定利率 與調用之間的固定時間段執行註解的方法。

fixedDelay 在最後一次調用結束和下一次調用結束之間執行帶有固定時間段的帶註釋的方法。

隨着固定利率,該方法的另一執行計劃的最後一次任務開始後發生了一定的時間。

隨着FIXEDDELAY下次調用最後一次任務結束發生了一定的時間。

當然,你的線程池必須有另一個空閒線程才能使任務按時運行(如果前一個線程仍在執行)。

+0

不起作用:採用固定利率,它不會再次觸發相同的方法。同樣固定的費率/固定的延遲,你會失去微調時間表的靈活性,例如只在週末運行,在9-5之間等 – Ben 2013-02-25 10:18:22

0

由於調度程序線程忙於運行您的任務,因此不會觸發新的執行。

爲了實現您所要求的行爲,將任務委託給執行程序線程。最簡單的方法是簡單地用@Async註釋該方法。

@Scheduled(cron = "* * * * * *") 
@Async 
public void doSomething() { 
    ... 
} 

但是要記住,你將不得不任務執行人池大小修剪到所需的能力,以便適應在parallell運行足夠的執行線程。