1. 程式人生 > >spring定時任務@Scheduled,非同步操作@Async

spring定時任務@Scheduled,非同步操作@Async

需求時定時更新專案裡面某一個裝置的狀態。

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(){
        // 業務       
    }

}