天天看点

EJB3.1 @Schedule 定时服务

我们在ejb中实现定时服务一般是实现TimerService接口,那么ejb3.1给我们带来了另一种实现定时服务的方式,就是@Schedule标注

@Schedule可用于自动创建一个timer,里面可以加入参数来限制调度时间。当一个方法被标注@Schedule后,到时间了就会自动被容器回调。

例如下例:

@Stateless

public class TimingManager {

@Schedule(minute="*",dayOfWeek="*",hour="*")

public void run() {

System.out.println("TimingManager run");

}

}

当容器运行以后,会自动执行@Schedule的方法,上例意思是每天每小时每分钟执行一次

Schedule表达式采用了模仿UNIX cron的日历语法格式。有8个主要属性可以按照下列的规则使用:

属性 属性值 示例
second [0, 59] second = "10"
minute [0, 59] minute = "30"
hour [0, 23] hour = "10"
dayOfMonth

- [1, 31] - day of the month 

- Last - last day of the month

- -[1, 7] - number of days before end of month

- {"1st", "2nd", "3rd", "4th", "5th", ..., "Last"} {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}- identifies a single occurrence of a day of the month 

dayOfMonth = "3"

dayOfMonth = "Last"

dayOfMonth = "-5"

dayOfMonth = "1st Tue"

month

- [1, 12] - month of the year

- {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}- month name

month = "7"

month = "Jan"

dayOfWeek

- [0, 7]- day of the week where both 0 and 7 refer to Sunday

- {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}- day's name

dayOfWeek = "5"

dayOfWeek = "Wed"

year Four digit calendar year year = "1978"
timezone Id of the related timezone timezone = "America/New_York"

每个属性值还有不同形式:

表达式类型 描述 示例
Single Value 限制属性只有一个值 dayOfWeek = "Wed"
Wild Card 对于给定的属性,允许任意合法值 month = "*"
List 限制属性允许两个或两个以上的值,中间用逗号隔开

DayOfMonth = "3,10,23"

dayOfWeek = "Wed,Sun"

Range 限制属性在一个封闭的区间段内 year = "1978-1984"
Increments  定义一个x/y 的表达式。限制属性在每y 秒调度一次,并且在x 时开始。

second = "*/10" - every 10 seconds

hour = "12/2"- every second hour starting at noon

再来多看一些示例吧:

每周二上午7:30开始调度:

@Schedule(hour = "7", minute = "30",  dayOfWeek = "Tue")

每周从周一到周五的,7点,15点,20点开始调度:

@Schedule(hour = "7, 15, 20", dayOfWeek = "Mon-Fri")

每周日的每个小时调度一次:

@Schedule(hour = "*", dayOfWeek = "0")

Last Friday of December, at 12 

每年12月的最后一个周五12时调用一次:

@Schedule(hour = "12", dayOfMonth = "Last Fri", month="Dec")

2009年每个月的最后三天的20点开始调用:

@Schedule(hour = "20", dayOfMonth = "-3", year="2009")

从下午三点开始,每个小时的第5分钟开始调用:

@Schedule(minute = "*/5", hour = "15/1")