2014年4月24日 星期四

在 Spring FrameWork 中做定時執行

在 Spring FrameWork 的環境中,想要做定時執行有好幾種作法,可以參考 [1-2]。
在這邊的範例是 [1-2] 有提到的其中一種作法,主要是利用 Spring 的 scheduled-tasks 搭配 cron expression 來控制執行時間。

首先先寫一個定時執行時要執行的類別,類別內包含某個任意名稱的方法。這個方法即是要執行的任務的內容。
package test.ExecutorTest;

import java.util.Calendar;

public class ExecutorTest {
  public void execute () {
    System.out.println("Run at " + Calendar.getInstance().getTimeInMillis());
  }
}

接著要在 Spring 的設定文件中加上 task 的 namespace。
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/task
                http://www.springframework.org/schema/task/spring-task-3.0.xsd">
.....
</beans>
這個步驟主要是為了 XML 定義的問題,這樣 IDE 在下一步寫 task 需要的 XML 標籤時,才有辦法正確地驗證標籤格式。
主要在這個步驟真正加上的是下面這兩個屬性。
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"

再來是同樣在 Spring 的設定文件上,加上關於任務的資訊,也就是完整的 XML 大約會長這樣:
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/task
                http://www.springframework.org/schema/task/spring-task-3.0.xsd">
  <bean id="task" class="test.ExecutorTest" />

  <task:scheduled-tasks> 
    <task:scheduled ref="task" method="execute" cron="0/25 * * * * *"/> 
  </task:scheduled-tasks>
</beans>
其中 task:scheduled 的屬性中,ref 表示的是要執行的類別的 bean 名稱,method 表示要執行的方法,cron 則是執行時間的 cron expression。
然後這樣就結束了~!

以上面設定的 cron expression 來說,執行時間是每 25 秒執行一次,因此會是每分鐘的 0 秒、25 秒和 50 秒時各執行一次。
執行結果如下:
Run at 1398312170000
Run at 1398312180000
Run at 1398312205000
Run at 1398312230000
Run at 1398312240000
Run at 1398312265000
Run at 1398312290000
Run at 1398312300001
Run at 1398312325000
Run at 1398312350000
Run at 1398312360001

如果需要一些常見的 cron expression 的範例,可以參考 [3]。

參考資料:
1、4 ways to schedule tasks in Spring 3 : @Scheduled example
2、Spring定时任务的几种实现
3、Cron Expression Examples

沒有留言: