spring定時任務@Scheduled,非同步操作@Async
阿新 • • 發佈:2018-11-15
需求時定時更新專案裡面某一個裝置的狀態。
1.定時任務:spring定時任務@Scheduled(cron = "50 * * * * ? ")
2.更新狀態採用非同步更新,java預設是同步的,非同步採用spring的@Async("async_update_gbStatus")
上程式碼spring配置xml實現定時任務,實現非同步。
<!-- 計劃任務配置,用 @Service @Lazy(false)標註類, 用@Scheduled(cron = "0 0 2 * * ?")標註方法 1.pool-size:初始執行緒大小,3-10表示如果3個執行緒滿足業務需求,則不會建立第四個,若滿足不了 則建立第四個最多10個。 2.keep-alive:當前執行緒執行完任務後,空閒的存活時間,0表示若空閒立即關閉,單位是秒。 3.queue-capacity:佇列,當3個執行緒都在工作時候,就把多餘的任務放在佇列裡面。 4.rejection-policy:報錯解決方案。 --> <task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true"/> <task:executor id="executor" pool-size="10" /> <task:executor id="async_update_gbStatus" pool-size="3-10" queue-capacity="100" keep-alive="0" rejection-policy="CALLER_RUNS"/> <task:scheduler id="scheduler" pool-size="10" />
在需要定時的方法上面加入@Scheduled(cron = "50 * * * * ? ")
@Component//會把這個類注入到spring中管理 @Service @Lazy(false) public class Test1{ @Scheduled(cron = "50 * * * * ? ") //50秒後執行 public void gbStatus(){ /*執行的非同步方法,非同步方法和當前呼叫的方法不能在同一個類中 否則無法實現非同步,官方文件有說明。*/ asyncMethod(); } }
在非同步方法中加上@Async("async_update_gbStatus")括號裡面的值和xml裡面的id也就是這個標籤task:executor的id值一致。
@service
public class Test2{
@Async("async_update_gbStatus")//之前沒加里面括號裡面的值會一起很多執行緒,最後會出錯
public asycMethod(){
// 業務
}
}