步步为营 SharePoint 开发学习笔记系列 七、SharePoint Timer Job 开发
概要
?? 項(xiàng)目需求要求我們每天晚上同步員工的一些信息到sharepoint 的user List ,我們決定定制開發(fā)sharepoint timer Job,Sharepoint timer Job是sharePoint的定時(shí)作業(yè)Job,需要安裝、布曙到服務(wù)器上,而這里我只是介紹下Job開發(fā)的例子,以供大家學(xué)習(xí)用。
開發(fā)設(shè)計(jì)
我們需要新建兩個(gè)類,TaskLoggerJob和TaskLoggerFeature,TaskLoggerJob實(shí)現(xiàn)這個(gè)Job具體做哪些工和,TaskLoggerFeature實(shí)現(xiàn)安裝和卸載這個(gè)Job以及定義Job執(zhí)行時(shí)間和方式。
在開發(fā)Job時(shí)需要引用如下Dll
using Microsoft.SharePoint; using Microsoft.SharePoint.Utilities; using Microsoft.SharePoint.Administration;TaskLoggerJob設(shè)計(jì)代碼如下:
public class TaskLoggerJob : SPJobDefinition{#region [Fields]#endregion#region [Constructors]/// <summary>/// Initializes a new instance of the TaskLoggerJob class./// </summary>public TaskLoggerJob(): base(){}/// <summary>/// Initializes a new instance of the TaskLoggerJob class./// </summary>/// <param name="jobName">Name of the job.</param>/// <param name="service">The service.</param>/// <param name="server">The server.</param>/// <param name="targetType">Type of the target.</param>public TaskLoggerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType): base(jobName, service, server, targetType){}/// <summary>/// Initializes a new instance of the TaskLoggerJob class./// </summary>/// <param name="jobName">Name of the job.</param>/// <param name="webApplication">The web application.</param>public TaskLoggerJob(string jobName, SPWebApplication webApplication): base(jobName, webApplication, null, SPJobLockType.Job){this.Title = "Task Logger";}#endregion#region [Public Methods]/// <summary>/// Executes the specified content db id./// </summary>/// <param name="contentDbId">The content db id.</param>public override void Execute(Guid contentDbId){try{// get a reference to the current site collection's content databaseSPWebApplication webApplication = this.Parent as SPWebApplication;SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];// get a reference to the "Tasks" list in the RootWeb of the first site collection in the content databaseSPList taskList = contentDb.Sites[0].RootWeb.Lists["Tasks"];// create a new task, set the Title to the current day/time, and update the itemSPListItem newTask = taskList.Items.Add();newTask["Title"] = DateTime.Now.ToString();newTask.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}#endregion#region [Private Methods]#endregion}在TaskLoggerFeature時(shí)我們調(diào)用這個(gè)構(gòu)造方法:
/// <summary>/// Initializes a new instance of the TaskLoggerJob class./// </summary>/// <param name="jobName">Name of the job.</param>/// <param name="webApplication">The web application.</param>public TaskLoggerJob(string jobName, SPWebApplication webApplication): base(jobName, webApplication, null, SPJobLockType.Job){this.Title = "Task Logger";}來初始化SPJobDefinition方法,Job具體要做的事性我們實(shí)現(xiàn)這個(gè)方法:
/// <summary>/// Executes the specified content db id./// </summary>/// <param name="contentDbId">The content db id.</param>public override void Execute(Guid contentDbId){try{// get a reference to the current site collection's content databaseSPWebApplication webApplication = this.Parent as SPWebApplication;SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];// get a reference to the "Tasks" list in the RootWeb of the first site collection in the content databaseSPList taskList = contentDb.Sites[0].RootWeb.Lists["Tasks"];// create a new task, set the Title to the current day/time, and update the itemSPListItem newTask = taskList.Items.Add();newTask["Title"] = DateTime.Now.ToString();newTask.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}在這個(gè)方法里我們可以同事實(shí)現(xiàn)很多任務(wù),而我們這里只是改變了它的title。
下面我們來講解TaskLoggerFeature的代碼設(shè)計(jì),首先引用:
using Microsoft.SharePoint; using Microsoft.SharePoint.Administration;而后代碼如下:
public class TaskLoggerFeature : SPFeatureReceiver{#region [Override Methods]/// <summary>/// Active the feature/// </summary>/// <param name="properties"></param>public override void FeatureActivated(SPFeatureReceiverProperties properties){SPSite site = properties.Feature.Parent as SPSite;SPSite currentSite = null;try{SPSecurity.RunWithElevatedPrivileges(delegate{currentSite = new SPSite(site.Url);});this.InstallTaskLoggerJob(currentSite);}catch (Exception ex){LogHepler.InitConfigListSiteUrl(site.Url);LogHepler.LogToShrepointList(ex);}finally{if (currentSite != null){currentSite.Dispose();}}}/// <summary>/// Deactive the feature/// </summary>/// <param name="properties"></param>public override void FeatureDeactivating(SPFeatureReceiverProperties properties){SPSite site = properties.Feature.Parent as SPSite;SPSite currentSite = null;try{SPSecurity.RunWithElevatedPrivileges(delegate{currentSite = new SPSite(site.Url);});SPWebApplication webApp = currentSite.WebApplication;this.UninstallTaskLoggerJob(webApp);}catch (Exception ex){LogHepler.InitConfigListSiteUrl(site.Url);LogHepler.LogToShrepointList(ex);}finally{if (currentSite != null){currentSite.Dispose();}}}/// <summary>/// Method that is executed when the feature end the installation/// </summary>/// <param name="properties"></param>public override void FeatureInstalled(SPFeatureReceiverProperties properties){}/// <summary>/// Method that is executed when the feature is unistalled/// </summary>/// <param name="properties"></param>public override void FeatureUninstalling(SPFeatureReceiverProperties properties){}#endregion#region [Private Methods]/// <summary>/// method to install the job/// </summary>/// <param name="web"></param>private void InstallTaskLoggerJob(SPSite site){TaskLoggerJob jobDef = new TaskLoggerJob("TaskLoggerJob", site.WebApplication);jobDef.Title = "TaskLoggerJob";jobDef.Properties.Add("SiteUrl", site.Url);this.InstallDayJob(jobDef, site, 23);//this.InstallHourJob(jobDef, site, 2);//this.InstallMinuteJob(jobDef, site, 10, 10);}/// <summary>/// Method to unistall a job/// </summary>/// <param name="web">The SPWeb where need to remove the job</param>private void UninstallTaskLoggerJob(SPWebApplication webApp){try {SPJobDefinitionCollection jobColl = webApp.JobDefinitions;if (jobColl != null){List<Guid> idsToRemove = new List<Guid>();foreach (SPJobDefinition jobDef in jobColl){if (!String.IsNullOrEmpty(jobDef.Title) && jobDef.Title.StartsWith("TaskLoggerJob")){idsToRemove.Add(jobDef.Id);}}if (idsToRemove.Count > 0){foreach (Guid gd in idsToRemove){jobColl.Remove(gd);}}}}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}/// <summary>/// Method to install the job that will execute by hour/// </summary>/// <param name="jobDef">The JobDefinition to apply</param>/// <param name="web">The SPWeb that will execute the job</param>/// <param name="minute">The minute to start the job in that hour</param>private void InstallDayJob(SPJobDefinition jobDef, SPSite site, int hour){try{SPWebApplication webApp = site.WebApplication;SPJobDefinitionCollection jboColl = webApp.JobDefinitions;SPDailySchedule daySched = new SPDailySchedule();daySched.BeginHour = hour;daySched.BeginMinute = 0;daySched.BeginSecond = 0;daySched.EndHour = hour;daySched.EndMinute = 0;daySched.EndSecond = 0;jobDef.Schedule = daySched;SPJobDefinition oldJob = this.GetJobDeffinition(jobDef.Title, jboColl);if (oldJob != null){jboColl.Remove(oldJob.Id);webApp.Update();}jboColl.Add(jobDef);webApp.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}/// <summary>/// Method to install the job that will execute by hour/// </summary>/// <param name="jobDef">The JobDefinition to apply</param>/// <param name="web">The SPWeb that will execute the job</param>/// <param name="minute">The minute to start the job in that hour</param>private void InstallHourJob(SPJobDefinition jobDef, SPSite site, int minute){try{SPWebApplication webApp = site.WebApplication;SPJobDefinitionCollection jboColl = webApp.JobDefinitions;SPHourlySchedule hourSched = new SPHourlySchedule();hourSched.BeginMinute = minute;jobDef.Schedule = hourSched;SPJobDefinition oldJob = this.GetJobDeffinition(jobDef.Title, jboColl);if (oldJob != null){jboColl.Remove(oldJob.Id);webApp.Update();}jboColl.Add(jobDef);webApp.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}/// <summary>/// Method to install the job that will execute by minute/// </summary>/// <param name="jobDef">The JobDefinition to apply</param>/// <param name="web">The SPWeb that will execute the job</param>/// <param name="secound">The seconds to start the job in that minute</param>private void InstallMinuteJob(SPJobDefinition jobDef, SPSite site, int second, int interval){try{SPWebApplication webApp = site.WebApplication;SPJobDefinitionCollection jboColl = webApp.JobDefinitions;SPMinuteSchedule minSched = new SPMinuteSchedule();minSched.Interval = interval;minSched.BeginSecond = second;jobDef.Schedule = minSched;SPJobDefinition oldJob = this.GetJobDeffinition(jobDef.Title, jboColl);if (oldJob != null){jboColl.Remove(oldJob.Id);webApp.Update();}jboColl.Add(jobDef);webApp.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}/// <summary>/// Get the JobDefinition to install or remove/// </summary>/// <param name="Title">Title of the job</param>/// <param name="jobCollection">The JobCollection to find the job</param>/// <returns>JbDefinition that found in this collection</returns>private SPJobDefinition GetJobDeffinition(string Title, SPJobDefinitionCollection jobCollection){SPJobDefinition result = null;if (jobCollection != null){foreach (SPJobDefinition job in jobCollection){if (job.Title.Equals(Title)){result = job;break;}}}return result;}#endregion}下面這個(gè)方法是激活這個(gè)Job的feature,在sharepoint里每一個(gè)Job都有一個(gè)feature來講行實(shí)現(xiàn),它會(huì)生成相應(yīng)的feature的xml方件:
/// <summary>/// Active the feature/// </summary>/// <param name="properties"></param>public override void FeatureActivated(SPFeatureReceiverProperties properties){SPSite site = properties.Feature.Parent as SPSite;SPSite currentSite = null;try{SPSecurity.RunWithElevatedPrivileges(delegate{currentSite = new SPSite(site.Url);});this.InstallTaskLoggerJob(currentSite);}catch (Exception ex){LogHepler.InitConfigListSiteUrl(site.Url);LogHepler.LogToShrepointList(ex);}finally{if (currentSite != null){currentSite.Dispose();}}} ? ? 卸載這個(gè)Job的方法如下: /// <summary>/// Deactive the feature/// </summary>/// <param name="properties"></param>public override void FeatureDeactivating(SPFeatureReceiverProperties properties){SPSite site = properties.Feature.Parent as SPSite;SPSite currentSite = null;try{SPSecurity.RunWithElevatedPrivileges(delegate{currentSite = new SPSite(site.Url);});SPWebApplication webApp = currentSite.WebApplication;this.UninstallTaskLoggerJob(webApp);}catch (Exception ex){LogHepler.InitConfigListSiteUrl(site.Url);LogHepler.LogToShrepointList(ex);}finally{if (currentSite != null){currentSite.Dispose();}}}?
Job的執(zhí)行時(shí)間可以按分、時(shí)、天、月、年來執(zhí)行可以進(jìn)行如下定義,分、時(shí)、天。概據(jù)你的需要來執(zhí)行。
/// <summary>/// Method to install the job that will execute by hour/// </summary>/// <param name="jobDef">The JobDefinition to apply</param>/// <param name="web">The SPWeb that will execute the job</param>/// <param name="minute">The minute to start the job in that hour</param>private void InstallDayJob(SPJobDefinition jobDef, SPSite site, int hour){try{SPWebApplication webApp = site.WebApplication;SPJobDefinitionCollection jboColl = webApp.JobDefinitions;SPDailySchedule daySched = new SPDailySchedule();daySched.BeginHour = hour;daySched.BeginMinute = 0;daySched.BeginSecond = 0;daySched.EndHour = hour;daySched.EndMinute = 0;daySched.EndSecond = 0;jobDef.Schedule = daySched;SPJobDefinition oldJob = this.GetJobDeffinition(jobDef.Title, jboColl);if (oldJob != null){jboColl.Remove(oldJob.Id);webApp.Update();}jboColl.Add(jobDef);webApp.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}/// <summary>/// Method to install the job that will execute by hour/// </summary>/// <param name="jobDef">The JobDefinition to apply</param>/// <param name="web">The SPWeb that will execute the job</param>/// <param name="minute">The minute to start the job in that hour</param>private void InstallHourJob(SPJobDefinition jobDef, SPSite site, int minute){try{SPWebApplication webApp = site.WebApplication;SPJobDefinitionCollection jboColl = webApp.JobDefinitions;SPHourlySchedule hourSched = new SPHourlySchedule();hourSched.BeginMinute = minute;jobDef.Schedule = hourSched;SPJobDefinition oldJob = this.GetJobDeffinition(jobDef.Title, jboColl);if (oldJob != null){jboColl.Remove(oldJob.Id);webApp.Update();}jboColl.Add(jobDef);webApp.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}/// <summary>/// Method to install the job that will execute by minute/// </summary>/// <param name="jobDef">The JobDefinition to apply</param>/// <param name="web">The SPWeb that will execute the job</param>/// <param name="secound">The seconds to start the job in that minute</param>private void InstallMinuteJob(SPJobDefinition jobDef, SPSite site, int second, int interval){try{SPWebApplication webApp = site.WebApplication;SPJobDefinitionCollection jboColl = webApp.JobDefinitions;SPMinuteSchedule minSched = new SPMinuteSchedule();minSched.Interval = interval;minSched.BeginSecond = second;jobDef.Schedule = minSched;SPJobDefinition oldJob = this.GetJobDeffinition(jobDef.Title, jboColl);if (oldJob != null){jboColl.Remove(oldJob.Id);webApp.Update();}jboColl.Add(jobDef);webApp.Update();}catch (Exception ex){LogHepler.LogToShrepointList(ex);}}?
在完成了上面的代碼設(shè)計(jì)后,我們接著就需要把Job布曙到服務(wù)器中。
要以上代碼生成Windows SharePoint Solution Package (*.WSP) 來布曙。
步驟如下:
一、首先進(jìn)入sharePoint Central administrator v3 管理頁面,選擇Operation下的Solution Management
二、檢索TaskLoggerJob.wsp
如果以前安裝過這個(gè)Job先要卸載,再安裝。?
三、執(zhí)行命令?? stsadm -o addsolution -filename "TaskLoggerJob.wsp"? 添加Job的solution
四、執(zhí)行命令 stsadm -o deactivatefeature -name TaskLoggerJob -url http://[site]/
????? 而后再執(zhí)行命令? stsadm -o execadmsvcjobs
五、執(zhí)行命令 stsadm -o activatefeature -name TaskLoggerJob -url http://[site]/
????? 而后再執(zhí)行命令? stsadm -o execadmsvcjobs
總結(jié)
sharepoint timer job是用來完成系統(tǒng)定里執(zhí)行的一此任務(wù),是由這個(gè)進(jìn)程完成的OWSTIMER.EXE .
作者:spring yang
出處:http://www.cnblogs.com/springyangwc/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
轉(zhuǎn)載于:https://www.cnblogs.com/springyangwc/archive/2011/07/25/2115963.html
總結(jié)
以上是生活随笔為你收集整理的步步为营 SharePoint 开发学习笔记系列 七、SharePoint Timer Job 开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么MIP-Cache存在
- 下一篇: BitMap的原理介绍与实现