SharePoint中开发自定义Timer Job

2015-01-27 10:19:31 · 作者: · 浏览: 10

SharePoint中开发自定义Timer Job


1. Timer Job简介

在SharePoint中有一个服务SharePoint timer service(owstimer.exe),这个服务用来进行异步处理一些SharePoint的数据,创建web application等等,为了缓解站点w3wp.exe的压力,而且Timer 服务可以说是占据了SharePoint的半边天,没有他那么SharePoint将不能正常工作


2. Timer Job 作用

很多时候我们需要定期自动去处理一些数据,例如:为了不影响业务性能有些数据在非工作时间系统自动处理,那么timer job就能够帮我们实现这个,在SharePoint中有很多原生的job,而且也支持自定义timer job去满足业务需求。


3. timer job的基类:

一般我们要编写一个自定义的timer job的话,我们需要继承SPJobDefinition ,然后重写Execute方法,在这个方法里面添加自己的业务逻辑代码,如下:


public class MyTimerJobDefinition : SPJobDefinition
{

public MyTimerJobDefinition () : base() { }


public MyTimerJobDefinition (SPWebApplication webApp) :
base(SapConstant.ReminderJobName, webApp, null, SPJobLockType.Job)
{}


public override void Execute(Guid targetInstanceId)
{
//base.Execute(targetInstanceId);
try
{
SPWebApplication webApp = this.Parent as SPWebApplication;

// todo....

}
catch (Exception ex)
{
//log
}
}


public override void Delete()
{
try
{
base.Delete();
}
catch (Exception ex)
{
//log
}
}
}


4. 自定义Timer Job的安装

在SharePoint中大多数自定义功能都是通过Feature去安装和部署的,当然Timer Job也是不例外的, 在项目中添加一个feature,然后重写相应的激活方法,如下:


[Guid("418ce432-d5e5-4fff-9a3f-ec46445bc105")]
public class Feature1EventReceiver : SPFeatureReceiver
{
// Uncomment the method below to handle the event raised after a feature has been activated.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
DeleteJob(webApp.JobDefinitions);


MyTimerJobDefinition simpleJob = new MyTimerJobDefinition(webApp);


SPDailySchedule schedule = new SPDailySchedule();


schedule.BeginHour = 9;
schedule.BeginMinute = 1;
schedule.BeginSecond = 1;
schedule.EndSecond = 30;
schedule.EndMinute = 6;
schedule.EndHour = 12;


simpleJob.Schedule = schedule;


simpleJob.Title = "My Custom Timer";
simpleJob.Update();

}
catch (Exception ex)
{
//log
}
}

// Uncomment the method below to handle the event raised before a feature is deactivated.

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
try
{
SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
DeleteJob(webApp.JobDefinitions);
}
catch (Exception ex)
{
//log
}
}

private void DeleteJob(SPJobDefinitionCollection jobs)
{
foreach (SPJobDefinition job in jobs)
{
if (job.Name.Equals("JobName",
StringComparison.OrdinalIgnoreCase))
{
job.Delete();
}
}
}
}