2013-03-22

Schedule in Spring 3.2.0 - 參數化

從前兩文 Schedule in Spring 3.1.2 與 Schedule in Spring 3.2.0 - Continued 一直逃避一個問題,就是 fixedRate 與 fixedDelay 只接受 long 型別的資料,不像 cron 接受字串。

以前是這麼用的。
@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>
---
---
---

沒有留言:

張貼留言