我们在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")