以前是這麼用的。
@Scheduled(fixedRate = 10000) @Scheduled(fixedDelay = 5000) @Scheduled(cron = "*/3 50-55 9,10 26 * ?")這有什麼問題呢?問題發生在「參數化」。
當想要(一般也都這樣)將 fixedRate、fixedDelay 或 cron 的值拉到 Properties 檔設定時,就會發生問題了。
先在 Properties 檔設定。
fixed.rate=1000 fixed.delay=1000 cron=*/3 50-55 9,10 26 * ?然後修改 Annotation 去讀 Properties。
@Scheduled(fixedRate = ${fixed.rate})
@Scheduled(fixedDelay = ${fixed.delay})
@Scheduled(cron = "${cron}")
看似沒問題,但是編譯不過!因為 fixedRate = ${fixed.rate} 這語法是錯的,必須像 cron 那樣加上雙引號,但是加上雙引號後,fixedRate 有意見了,因為 fixedRate 只接受 long 型別,不能用 String 型別。
Google 了半天,無解,至少在 Annotaion 這塊無解,只能改用 XML 的設定方式。
<bean id="usreService" class="ja.neil.service.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<task:scheduled-tasks scheduler="neilScheduler">
<task:scheduled ref="usreService" method="syncUser" fixed-rate="${syncUser.interval}" />
<task:scheduled ref="usreService" method="backupUser" fixed-rate="${backupUser.interval}" />
</task:scheduled-tasks>
<task:scheduler id="neilScheduler" pool-size="10" />
再進階使用,Spring Express Language 可以做運算。<task:scheduled-tasks scheduler="neilScheduler">
<task:scheduled ref="usreService" method="syncUser" fixed-rate="#{${syncUser.interval} * 60}" />
<task:scheduled ref="usreService" method="backupUser" fixed-rate="#{${backupUser.interval} * 60}" />
</task:scheduled-tasks>
------
---
沒有留言:
張貼留言