2010-03-23 4 views
1

Я создал очень простое задание таймера sharepoint. Все, что я хочу сделать, это перебрать список и обновить каждый элемент списка, чтобы он запускал существующий рабочий процесс, который работает нормально. Другими словами, все, что я пытаюсь сделать, это ограничить то, что рабочие процессы не могут запускаться по расписанию. Я написал класс, который наследует от SPJobDefinition, который выполняет эту работу, и у меня есть класс, который наследует от SPFeatureReceiver, чтобы установить и активировать его. Я создал функцию, использующую SPVisualdev, которую мои коллеги использовали в прошлом для разработки других SP.Проблема Активация таймера Sharepoint

Мой класс Работа ниже:

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(); 
    } 

Проблема у меня есть, что, когда Я пытаюсь активировать функцию, которая бросает исключение NullReferenceException на строке oDriverSafetyCheckTrigger.Update(). Я не уверен, что является нулевым в этом случае, пример, который я выполнил для этого, - это this учебник. Я не уверен, что я делаю неправильно.

ответ

1

Я побежал код в консольном приложении и получил следующее исключение при вызове .update()

«DriverSafetyCheckTrigger не может быть десериализованным, поскольку он не имеет конструктора по умолчанию»

Может быть, это поможет ?

+0

Все равно, но я не думаю, что это проблема. У него обычно был конструктор без параметров, но это не имело никакого значения. Также я не пытаюсь сериализовать/десериализовать его. Спасибо за ваш вклад. –

+0

Извинения, это была проблема. По какой-то причине Sharepoint должен попытаться сериализовать/десериализовать класс. В любом случае добавление конструктора без параметров в класс DriverSafetyCheck устраняет проблему. –

+0

Объяснение, которое я могу придумать для необходимости сериализации/десериализации, состоит в том, что ваш класс DriverSafteyCheckTrigger содержит данные. Поле pi_SiteUrl получает значение только при настройке задания таймера, но задание таймера должно использовать это значение каждый раз, когда выполняется задание. Если сериализация не происходит, pi_SiteUrl будет пустым при выполнении задания. –

0

У меня есть подобный код, который работает в одном из моих Feature ресиверов:

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.

Смежные вопросы