我创建了一个非常简单的sharepoint计时器作业。我想要它做的就是遍历一个列表并更新每个列表项,以便它触发一个工作正常的现有工作流。换句话说,我想要做的就是解决无法按计划触发工作流程的限制。我编写了一个继承自SPJobDefinition的类来完成工作,我有一个继承自SPFeatureReceiver的类来安装和激活它。我使用SPVisualdev创建了这个功能,这是我的同事过去用于其他SP开发的。
我的工作课程如下:
public class DriverSafetyCheckTrigger : SPJobDefinition
{
private string pi_SiteUrl;
public DriverSafetyCheckTrigger(string SiteURL, SPWebApplication WebApp):base("DriverSafetyCheckTrigger",WebApp,null, SPJobLockType.Job)
{
this.Title = "DriverSafetyCheckTrigger";
pi_SiteUrl = SiteURL;
}
public override void Execute(Guid targetInstanceId)
{
using (SPSite siteCollection = new SPSite(pi_SiteUrl))
{
using (SPWeb site = siteCollection.RootWeb)
{
SPList taskList = site.Lists["Driver Safety Check"];
foreach(SPListItem item in taskList.Items)
{
item.Update();
}
}
}
}
}
功能接收器类中唯一的东西是我已经覆盖了下面的FeatureActivated方法:
public override void FeatureActivated(SPFeatureReceiverProperties Properties)
{
SPSite site = Properties.Feature.Parent as SPSite;
// Make sure the job isn't already registered.
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == "DriverSafetyCheckTrigger")
job.Delete();
}
// Install the job.
DriverSafetyCheckTrigger oDriverSafetyCheckTrigger = new DriverSafetyCheckTrigger(site.Url, site.WebApplication);
SPDailySchedule oSchedule = new SPDailySchedule();
oSchedule.BeginHour = 1;
oDriverSafetyCheckTrigger.Schedule = oSchedule;
oDriverSafetyCheckTrigger.Update();
}
我遇到的问题是,当我尝试激活该功能时,它会在行oDriverSafetyCheckTrigger.Update()上抛出NullReferenceException。我不确定在这种情况下什么是null,我所遵循的示例是this教程。我不确定我做错了什么。
答案 0 :(得分:1)
我在控制台应用程序中运行了您的代码,并在调用.Update()
时遇到以下异常“DriverSafetyCheckTrigger无法反序列化,因为它没有公共默认构造函数”
也许这会有所帮助?
答案 1 :(得分:0)
我的功能接收器中有类似的代码:
string jobName = "MyJobDefinition";
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == jobName)
{
job.Delete();
}
}
SPDailySchedule schedule = new SPDailySchedule();
schedule.EndHour = 2;
schedule.EndMinute = 59;
schedule.EndSecond = 59;
SPJobDefinition jobDefinition = new MyJobDefinition(jobName, site.WebApplication);
jobDefinition.Schedule = schedule;
jobDefinition.Update();
我想知道你的问题是否符合时间表。尝试设置BeginMinute,也可以设置BeginSecond。您也可以尝试将End值与Begin值一起设置或代替Begin值。