這是我的用例。一起使用Spring @Scheduled和@Async
傳統系統更新數據庫隊列表QUEUE。
我希望計劃定期作業 - 檢查隊列 的內容 - 如果有表中的行鎖定該行並做了一些工作 - 刪除隊列中排
如果以前的工作仍在運行,那麼將創建一個新線程來完成這項工作。我想配置最大併發線程數。
我使用Spring 3和我目前的解決辦法是以下(使用1毫秒的固定利率,以獲得線程基本上連續運行)
@Scheduled(fixedRate = 1)
@Async
public void doSchedule() throws InterruptedException {
log.debug("Start schedule");
publishWorker.start();
log.debug("End schedule");
}
<task:executor id="workerExecutor" pool-size="4" />
這創造了4個線程直客做和線程正確分享隊列中的工作量。但是,當線程需要很長時間才能完成時,我似乎正在獲取內存泄漏。
java.util.concurrent.ThreadPoolExecutor @ 0xe097b8f0 | 80 | 373,410,496 | 89.74%
|- java.util.concurrent.LinkedBlockingQueue @ 0xe097b940 | 48 | 373,410,136 | 89.74%
| |- java.util.concurrent.LinkedBlockingQueue$Node @ 0xe25c9d68
所以
1:我應該使用@Async和@Scheduled在一起嗎?
2:如果不是那麼我怎麼才能用彈簧來達到我的要求?
3:僅當其他線程忙時才能創建新線程?
謝謝大家!
編輯:我覺得作業隊列漸漸無限長的......現在,使用
<task:executor id="workerExecutor"
pool-size="1-4"
queue-capacity="10" rejection-policy="DISCARD" />
將報告與結果
這豈不是沒有'@ Async'正常工作?無論如何,用'@ Scheduled'註解的方法應該是異步執行的。 – ach
如果你想讓「線程連續運行」,那麼你應該不會真的在首先使用@Scheduled。它的用途是「預定」的活動,而不是連續的活動...... – JoeG
你可能會考慮製作publishWorker.start();方法異步。 –