SPB-设计机制-任务机制
来自站长百科
导航: 上一页
任务是SpaceBuilder提供的一种基础服务,可以在配置文件中对任务进行配置,然后这些任务会按照一定的时间间隔自动运行。
SpaceBuilder很多功能都需要依赖任务来完成,比如:
- SpaceBuilder.Components.ViewsTask,用于对各种对象进行计数,但是并不是每次计数的变更都修改数据库,而是把这些计数先保存在内存中,然后每隔一段时间批量对数据库进行更新;
- SpaceBuilder.LuceneSearch.UserSearch.PersonUserIndexTask、SpaceBuilder.LuceneSearch.PostSearch.PostIndexTask,用于把数据库中的变更定期更新到全文检索的文件中;
- SpaceBuilder.Components.EmailTask,用于定期的把Email队列的Email批量发送出去; …
下面主要介绍一下如何定义自己的任务,定义一个任务一般分为两个步骤:
- 开发一个Task;
在SpaceBuilder.config中进行配置。
一、开发Task
编写一个自己的Task非常简单,只需要实现ITask接口即可。每次Task执行时会自动调用Execute方法。
例如,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代表一个线程。
- 针对每个线程中可以设置一个统一的时间间隔来执行其中的Task,可以用分钟、秒两种单位来进行设置,例如<Thread minutes="5">或者<Thread seconds="5">;
- 针对每个Task可以设置enabled(是否启用该Task)、enableShutDown(如果执行时出现错误是否允许关闭该Task)两个属性,这两个属性都是bool类型所以可以用“true”或“false”进行配置;
- 针对每个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"];
三、典型用途
- SpaceBuilder.Common.CounterTask,用于对各种对象进行计数。为了提升性能,但是并不是每次计数的变更都修改数据库,而是把这些计数先保存在内存中,然后每隔一段时间批量对数据库进行计数更新;
- SpaceBuilder.LuceneSearch.FileThreadIndexTask等,用于把数据库中的变更定期更新到全文检索的文件中;
- SpaceBuilder.Common.EmailTask,用于定期的把Email队列的Email批量发送出去;
- SpaceBuilder.Common.UserVisitsTask,用于把访客记录定期的更新到数据库中;