接着上一次的关于Scheduling Component的介绍,今天继续介绍几个稍微复杂点的示例,并且提供测试和Demo程序的下载。
C11. 从一年中的第100天开始,每隔5天执行一次:
<calendar> <year> <day from="100" interval="5"> </day> </year> </calendar>
|
C12. 继续上面的例子,我们还可以希望它能够从一年中的100小时开始,每隔50小时运行一次:
<calendar> <year> <hour from="100" interval="50"> </hour> <day from="100" interval="5"> </day> </year> </calendar>
|
C13. 现在公司里一般按照财政年度来进行规划和安排,假设一个公司的财政年度是从每年的3月19号,到次年的3月18号,那么每个财政年度的第360天可以表示如下:
<calendar> <year firstMonth="3" firstDay="19"> <day appoint="360"> </day> </year> </calendar>
|
C14. 同样我们也可以表示财政季度,假设财政季度从每个季度的第2个月的第18天开始,到下个季度的第2个月的第17天。那么每个财政季度的第88天可以表示如下:
<calendar> <quarter firstMonth="2" firstDay="18"> <day appoint="88"> </day> </quarter> </calendar>
|
C15. 另外我们也可以把每个月从领工资的那天开始算起,作为工作月。假如每月5号发工资,那么要表示每次拿了工资后的第10天,可以如下所示:
<calendar> <month firstDay="5"> <day base="0" appoint="10"> </day> </month> </calendar>
|
C16. 对于学校的学生来说,每个学期应该是它们作为规划的时间范围,下面的例子表示某个学校的两个学期中的第20个星期:
<calendar> <term beginMonth="9" beginDay="8" endMonth="1" endDay="15"> <week appoint="20"> </week> </term> <term beginMonth="2" beginDay="13" endMonth="7" endDay="30"> <week appoint="20"> </week> </term> </calendar>
|
C17. 有的时候你可能会从某个月的某天开始跨度几个月到另外一个月的某天结束作为完成某个任务或者完成某个项目的时期。比如某个很庞大的项目,公司计划从8月8号开始,中间跨度2年,做到后年的6月6号:
<calendar> <term beginMonth="8" beginDay="8" yearSpan="2" endMonth="6" endDay="6"> <week appoint="20"> </week> </term> </calendar>
|
C18. 在比如有个短期任务,需要三个月的时间,从某个月的8号开始,到三个月后的6号结束:
<calendar> <span beginDay="8" monthSpan="3" endDay="6"> <week appoint="10"> </week> </span> </calendar>
|
C19. 有的时候我们需要指定某个具体的时间范围,比如从2005年的12月8号到2006年的3月6号:
<calendar> <scope begin="2005-12-8" end="2006-3-6"> <day appoint="88"> </day> </scope> </calendar>
|
C20. 我们还可以在日历规则中对时间的安排来进行分组和规类,这样可读性可能会好点:
<calendar> <group comment="工作日"> <week> <day from="1" to="5"> </day> </week> </group> <group comment="休息日"> <week> <day appoint="6,0"> </day> </week> </group> </calendar>
|
C30. 还可以把某个组匹配的时间排除在外,比如下面的例子在秒数是6的整数倍的时候执行,但是在10的整数倍的时候除外:
<calendar> <second interval="6"> </second> <exclude> <second interval="10"> </second> </exclude> </calendar>
|
C32. 每年的5月的第2个星期天为母亲节和6月的第三个星期天为父亲节:
<calendar> <year> <month appoint="5"> <week firstDay="1" appoint="2"> <day base="1" appoint="7"> <!-- 将星期一设为每个星期的第一天,星期天则为第七天 --> </day> </week> </month> <month appoint="6"> <week firstDay="1" appoint="3"> <day base="1" appoint="7"> <!-- 将星期一设为每个星期的第一天,星期天则为第七天 --> </day> </week> </month> </year> </calendar>
|
C33. 假设每天都工作的很晚,除开母亲节和父亲节要提早回家问候父母:
<calendar> <year> <week> <day from="1" to="5"> </day> </week> <exclude> <month appoint="5"> <week firstDay="1" appoint="2"> <day base="1" appoint="7"> </day> </week> </month> <month appoint="6"> <week firstDay="1" appoint="3"> <day base="1" appoint="7"> </day> </week> </month> </exclude> </year> </calendar>
|
C34. 日历规则CalendarRule还是可以自身执行的规则,里面可以嵌套执行的指令。比如每次母亲节和父亲节,都提醒您慰问父母:
<calendar> <year> <month appoint="5"> <week firstDay="1" appoint="2"> <day base="1" appoint="7"> <hour appoint="8"> <execute> <instruction command="Message"> <parameter name="Icon" value="Information" /> <parameter name="Text" value="今天是母亲节,不要忘了忘了慰问母亲哦:)"/> </instruction> </execute> </hour> </day> </week> </month> <month appoint="6"> <week firstDay="1" appoint="3"> <day base="1" appoint="7"> <hour appoint="8"> <execute> <instruction command="Message"> <parameter name="Icon" value="Information" /> <parameter name="Text" value="今天是父亲节,不要忘了忘了慰问父亲哦:)"/> </instruction> </execute> </hour> </day> </week> </month> </year> </calendar>
|
C35. 在日历规则中还可以指定约束来过虑匹配的时间,比如从工作时间中过虑出所有的节假日:
<calendar> <year> <week> <day from="1" to="5"> <constraint> <!-- 排除掉节假日 --> <not> <holiday month="1" day="1" /> <!-- 元旦 --> </not> <not> <vacation beginMonth="5" beginDay="1" endMonth="5" endDay="7" /> <!-- 五一7天假 --> </not> <not> <vacation beginMonth="10" beginDay="1" endMonth="10" endDay="7" /> <!-- 国庆7天假 --> </not> </constraint> </day> </week> </year> </calendar>
|
这次提供了两个测试程序:
LaserReminder:是一个托盘程序,它会按照config文件中的scheduling配置,定期地提醒您。他可以弹出MessageBox框,也可以通过命令行执行其他程序。
SchedulePredictor:一个测试程序,您可以在中间的文本框中输入Schedule的XML,然后按下中间的按钮,它会预测出未来的规则执行时间在什么时候。
相关文件的下载如下:
/Files/Laser_Lu/SchedulingComponentDemo.rar