【IT168技术文档】
首先,编写计时器程序,也就是继承于SPJobDefinition的类,我写的叫做EventCheckTimer。
其次,编写部署这个计时器所需要的安装器,也就是继承SPFeatureReceiver的类,我这里叫做EventCheckTimerInstaller
然后就很清楚了,使用这个Installer将EventCheckTimer部署到服务器上,部署的方式,是将feature.xml、 mainifest.xml、强命名密钥、以及这两个类生成的dll文件打包成wsp格式的文件(其实就是cab文件),你也许会用到这个wsp部署的模板:wsp模板。
好的,我们引入程序:
这一个类是Timer Job的主类,系统主要是调用里边的Execute方法,这个方法的参数targetInstanceId(内容数据库ID)并不需要你来传递,而是系统在合适的时间在调用的时候自动传递的,你可以把它看作几乎被我们写烂的Main函数:)
using System; using Microsoft.SharePoint; using Microsoft.SharePoint.Administration; namespace MyCompany.Management.Employees { /// <summary> /// 这一个类是计时器的主工作类,系统会按照在Installer中 /// 设定的schedule定期调用此类中的Execute方法 /// </summary> public class EventCheckTimer : SPJobDefinition { public EventCheckTimer() : base() { } /// <summary> /// 初始化EventCheckTimer /// 更多的构造函数请参看SDK /// </summary> /// <param name="_timername">计时器的名称</param> /// <param name="_wp">Web应用程序名称</param> public EventCheckTimer(string _timername, SPWebApplication _wp) : base(_timername, _wp, null, SPJobLockType.ContentDatabase) { this.Title = "合同到期提醒器0.04"; } /// <summary> /// 此方法由系统调用,contentDbId也由系统传递 /// </summary> /// <param name="_contentdbid">内容数据库的id</param> public override void Execute(Guid targetInstanceId) { SPWebApplication webApplication = this.Parent as SPWebApplication; SPContentDatabase contentDb = webApplication.ContentDatabases[targetInstanceId]; DateTime dt; //遍历当前员工库中的员工,审查所有可能的提醒事件 foreach (SPListItem li in contentDb.Sites[0].AllWebs["Employees"].Lists["员工库"].Items) { if (li["合同止时间"] != null) { dt = Convert.ToDateTime(li["合同止时间"]); TimeSpan ts = (dt.Date - DateTime.Today.Date); //如果合同止时间小于当前时间,这种情况一般只发生在服务崩溃的时候 if (dt.Date < DateTime.Now.Date) { SPListItem si = contentDb.Sites[0].AllWebs["Employees"].Lists["任务"].Items.Add(); si["标题"] = String.Format("{0}的合同已经到期!", li["员工姓名"]); si["截止日期"] = DateTime.Now.AddDays(7); si.Update(); } else if (ts.Days <= 30)//如果距离现在有30天的时间,那么发出提醒 { SPListItem si = contentDb.Sites[0].AllWebs["Employees"].Lists["任务"].Items.Add(); si["截止日期"] = DateTime.Now.AddDays(7); si["标题"] = String.Format("{0}的合同将于{1}天后到期,日期:{2}", li["员工姓名"], (dt.Date - DateTime.Now.Date), li["合同止时间"]); si.Update(); } } } } } }