OSCache中的cron expression

在OSCache2.0以前的版本,内容只能根据它在缓存里呆了长时间来判断是否过期,比如,她是基于内容的年龄的。如果你需要指定一个特殊的日期/时间使内容过期,你就得自己动手写一个自定制的RefreshPolicy类。 OSCache2.0现在给你一种可以根据指定的时间使内容过期的能力,这是一种基于cron表达式的能力。
What is a Cron Expression?
你们中的许多可能已经对于unix中的cron程序非常的熟悉了。对于那些不熟悉的来说,cron是一个允许用户在“用户可设置”的时间自动执行命令或者脚本的后台处理过程。OSCache之所以被关注的一个重要原因就是cron表达式的语法允许用户当命令要被执行的时候来进行指示 - 现在你可以使用相同的语法来使OSCache中的内容统一过期!一个cron表达式是一个简单的文本字符串,指定被用来比较的日期和或时间。
How Does OSCache Match Against an Expression?
从某种意义上说,OSCache使用cron表达式看起来和你起初所期望的是向违背的。当使用一个cron表达式来测试一个entry是否过期时,OSCache找到一个和表达式所定义的想匹配的日期/时间(在当前时间以前找)。这个日期/时间就被当做“过期时间” - 在这个时间以前被装入缓存的entry都被视为过期,并抛出NeedsRefreshException异常。比如说,假定你指定了一个cron表达式为每小时都匹配一次, ("0 * * * *")。如果现在的时间是10:42,那么所有10:00以前被放入缓存的内容都会被视为过期。
What is the Difference Between the Refresh Period and a Cron Expression?
refresh周期和cron表达式的区别是refresh周期指定了一个entry所能存活的最长年龄。同时,一个cron表达式指定了一个特殊的过期时间,并将忽略这个entry的年龄大小。
比如,设想你在10:29am缓存了一个对象。使用refresh周期为30分钟的话,entry将在10:59过期。如果使用一个为 "0,30 * * * *"的cron表达式的话,entry将在10:30过期。
The Cron Expression Syntax
一个cron表达式由以下5个部分组成:
 分钟(Minute) - 指定在一小时的第几分钟使内容过期。它应该是有个0到59的数字。
 小时(Hour) - 决定在一天中的第几个小时的时候将内容视为过期。它指定使用24小时制,所以它的值应该在0到23之间。
 一月中的一天(DOM) - 这里是一个1到31的数字。它指示了在哪一天将内容视为过期。例如:将每个月的第10天做为过期日,那么这个部分应该填写10。
 月(month) - 一年中的第几个月将视为内容过期。这里可以用数字(1到12)表示,也可以月份真实名称(如:'January')。月份的名字可以不在乎大小写并且只有开头的三个字母有用,其他的可以忽略。
 一周中的一天(DOW) - 指出在一周中的哪一天内容过期,这里可以用数字值(0-6,  0 = Sunday, 1 = Monday, ..., 6 = Saturday),或者你也可以使用每天的具体名称,就象月的名字一样,DOW一样不在乎大小写,并且只有开头的三个字母有用。 如果你不想为一个特定的部分指定值(比如,你想让你的cron表达式中的某一部分可以匹配任何一个允许的值),那就使用*字符来作为该部分的值。

例,定义一个在4月的每天中的11:45pm使内容过期的表达式,可以写成"45 23 * April *"。 OSCache同样允许你随意在每个部分的指定list、range和interval(或者是这三者的集合)。
 lists - 在list中的项目用','分割。内容过期的时间将匹配list中每一个指定的值。例如,"0,15,30,45 * * * *" 将每隔15分钟报告过期。
 ranges - 这里使用'-'来划分每一个范围。一个range将包含从这个范围起始到结束(包含边界)中的所有值。例如,"* * * Jan-June *" 将在一年中的头六个月的每分钟报告内容过期。
 intervals - 一个间隔用'/'来分隔。在'/'左边的值是有一个起始点或者说是一个需要增长的范围,而右边的值指定了间隔或者说是步长。如下例:
"10/20 * * * *" 等价于"10,30,50 * * * *", "10-45/20 * * * *" 将只匹配一小时中的第10分钟和第30分钟, 因为第50分钟已经超过了他所指定的范围(10-45)。在一个间隔的左手边使用‘*’表示在范围内所有可用的值。
Eg "*/10 * * * *" matches minutes 0,10,20,30,40 and 50.
Notes
 如果你愿意的话,你可以同时既指定一个cron表达式又指定了一个refresh间隔。如果你想在午夜报告内容过期,同时有不希望内容的寿命超过6小时,这时这种做法是很有帮助的(个人认为:这个功能完全可以仅仅通过一个cron表达式来实现)。
 指定超出范围的值,比如在月的部分你写了个13,将会导致一个ParseException被抛出。
 如果一个DOM在一个给定的月份中并不存在,将会抛出ParseException异常。例如:我们永远都不会找到和"* * 31 Feb *" 匹配的结果,因为2月从来就没有31号。
 不能同时既指定DOM值又指定DOW值,其中一个必须被设置为'*',否则一个ParseException将被抛出。
 闰年和local daylight savings time在这里都是有效的。例如,"0 0 29 Feb *" 将与2月29日的凌晨时刻匹配,只是4年才有一次。
 用来和cron表达式进行匹配的当前时间通常基于服务器上的本地时间。