SPB-设计机制-任务机制

来自站长百科
跳转至: 导航、​ 搜索

导航: 上一页

任务SpaceBuilder提供的一种基础服务,可以在配置文件中对任务进行配置,然后这些任务会按照一定的时间间隔自动运行。

SpaceBuilder很多功能都需要依赖任务来完成,比如:

  1. SpaceBuilder.Components.ViewsTask,用于对各种对象进行计数,但是并不是每次计数的变更都修改数据库,而是把这些计数先保存在内存中,然后每隔一段时间批量对数据库进行更新;
  2. SpaceBuilder.LuceneSearch.UserSearch.PersonUserIndexTask、SpaceBuilder.LuceneSearch.PostSearch.PostIndexTask,用于把数据库中的变更定期更新到全文检索的文件中;
  3. SpaceBuilder.Components.EmailTask,用于定期的把Email队列的Email批量发送出去; …

下面主要介绍一下如何定义自己的任务,定义一个任务一般分为两个步骤:

  • 开发一个Task;

在SpaceBuilder.config中进行配置。

一、开发Task

编写一个自己的Task非常简单,只需要实现ITask接口即可。每次Task执行时会自动调用Execute方法。

Spacebuilder096.jpg

例如,FileThreadIndexTask.cs代码如下:


/// <summary>
/// 定期把FileThread的变更情况更新到Lucene索引文件
/// </summary>
public class FileThreadIndexTask : ITask
{
    /// <summary>
    /// 每次更新索引的最大数目
    /// </summary>
    private int count = 1000;

    #region ITask Members
    public void Execute(System.Xml.XmlNode node)
    {
        XmlAttribute countNode = node.Attributes["count"];
        if (countNode != null)
        {
            int.TryParse(countNode.Value, out count);
        }
        IndexPosts(count);
    }
    #endregion
}

二、配置Task

开发完Task以后,必须在SpaceBuilder.config中进行配置,它才会自动运行。以下代码是一个典型的Task配置:

开发完Task以后,必须在SpaceBuilder.config中进行配置,它才会自动运行。以下代码是一个典型的Task配置:

<Tasks>
    <Threads>
        <Thread minutes="5">
            <task name="FileThreadIndexTask"
                  type="SpaceBuilder.LuceneSearch.FileThreadIndexTask, SpaceBuilder.File.Web"
                  enabled="true"
                  enableShutDown="false" />
        </Thread>
    </Threads>
</Tasks>

SpaceBuilder中的所有Task都是在Tasks节点进行配置的,其中Tasks/Threads/Thread代表一个线程。

  1. 针对每个线程中可以设置一个统一的时间间隔来执行其中的Task,可以用分钟、秒两种单位来进行设置,例如<Thread minutes="5">或者<Thread seconds="5">;
  2. 针对每个Task可以设置enabled(是否启用该Task)、enableShutDown(如果执行时出现错误是否允许关闭该Task)两个属性,这两个属性都是bool类型所以可以用“true”或“false”进行配置;
  3. 针对每个Task除了enabled、enableShutDown两个属性外还可以配置任何其他的属性,但是除这两个属性以外的属性只能在自己的Task中进行解析及使用.

例如:EmailTask:

int failureInterval = 15;   //如果发送失败,下一次多长时间再此发送(用分钟表示)
            int numberOfTries = 10;     //发送失败后的重试次数
            // Get the failureInterval setting
            XmlAttribute failureIntervalNode = node.Attributes["failureInterval"];
            XmlAttribute numberOfTriesNode = node.Attributes["numberOfTries"];

三、典型用途

  1. SpaceBuilder.Common.CounterTask,用于对各种对象进行计数。为了提升性能,但是并不是每次计数的变更都修改数据库,而是把这些计数先保存在内存中,然后每隔一段时间批量对数据库进行计数更新;
  2. SpaceBuilder.LuceneSearch.FileThreadIndexTask等,用于把数据库中的变更定期更新到全文检索的文件中;
  3. SpaceBuilder.Common.EmailTask,用于定期的把Email队列的Email批量发送出去;
  4. SpaceBuilder.Common.UserVisitsTask,用于把访客记录定期的更新到数据库中;


参考资料[ ]