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接口即可。

posted on 2012-09-22 08:35  Qlin  阅读(1967)  评论(0编辑  收藏  举报