1.引言
上一节介绍了调度时间,不清楚的可以参考[Scheduled Timer]第二回,里面谈到了一个,定时器Timer阻塞,而导致定时器延时;或者是网站关停了几个小时,导致本该定时执行的活动没有执行,这都引出一个问题,就是上次执行的时间要记录下来,保存到数据库或者文件里,否则恢复不了,这就引出了EventStorage。
2.EventStorage
EventStorage是事件持久化,就是把Timer上次执行的时间保存下来,以便能够恢复执行,也就是可以用上节中讲到的IScheduledItem的AddEventsInInterval方法进行恢复。Scheduled Timer提供了一个IEventStorage接口,如下:
/// <summary> ///事件存储(持久化) /// </summary> public interface IEventStorage { /// <summary> /// 记录最后一次时间 /// </summary> /// <param name="Time"></param> void RecordLastTime(DateTime Time); /// <summary> /// 读取最后一次时间 /// </summary> /// <returns></returns> DateTime ReadLastTime(); }
接口很简单,两个方法,一个是记录,一个是读取。
- 什么时候读取,当Timer第一次启动时进行读取。
- 为什么读取,读取上一次成功执行的时间,通过IScheduledItem的AddEventsInInterval方法可以把上次执行的时间到现在执行的时间所有的任务获取到。
- 什么时候记录,每当Timer的Elapsed事件执行时,把ElapsedEventArgs.SignalTime的时间进行记录下来。
下面看看Scheduled Timer其中的一个实现,文件存储:
/// <summary> ///xml文件存储 /// </summary> public class FileEventStorage : IEventStorage { string _FileName; string _XPath; XmlDocument _Doc = new XmlDocument(); public FileEventStorage(string fileName, string xPath) { _FileName = fileName; _XPath = xPath; } public void RecordLastTime(DateTime time) { _Doc.SelectSingleNode(_XPath).Value = time.ToString(); _Doc.Save(_FileName); } public DateTime ReadLastTime() { _Doc.Load(_FileName); string Value = _Doc.SelectSingleNode(_XPath).Value; if (Value == null || Value == string.Empty) return DateTime.Now; return DateTime.Parse(Value); } }
上面是保存到xml,这样的话,即便是网站重启,也可以读取xml文件保存的时间,进行恢复执行。
3.总结
Scheduled Timer提供了内存持久化,文件持久化,空持久化。其它像数据库持久化,都可以自己实现,默认是内存持久化。实现起来非常简单,实现IEventStorage接口即可。
作者:Qlin
出处:http://www.cnblogs.com/qqlin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。