2010-03-23 6 views
1

J'ai créé un travail de minuteur de sharepoint très simple. Tout ce que je veux faire, c'est parcourir une liste et mettre à jour chaque élément de la liste afin qu'il déclenche un flux de travail existant qui fonctionne bien. En d'autres termes, tout ce que j'essaie de faire, c'est contourner la limitation que les flux de travail ne peuvent pas être déclenchés sur une base programmée. J'ai écrit une classe qui hérite de SPJobDefinition qui fait le travail et j'ai une classe qui hérite de SPFeatureReceiver pour l'installer et l'activer. J'ai créé la fonctionnalité en utilisant SPVisualdev que mes collègues ont utilisé dans le passé pour d'autres développements SP.Problème lors de l'activation du travail du minuteur Sharepoint

Ma classe d'emploi est ci-dessous:

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

Et la seule chose dans la classe caractéristique de recepteur est que je l'ai substituée la méthode FeatureActivated ci-dessous:

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

Le problème que j'ai est que lorsque j'essaie d'activer la fonctionnalité, il lève une exception NullReferenceException sur la ligne oDriverSafetyCheckTrigger.Update(). Je ne suis pas sûr de ce qui est nul dans ce cas, l'exemple que j'ai suivi pour ce tutoriel est this. Je ne suis pas sûr de ce que je fais mal.

Répondre

1

J'ai couru votre code dans une application console et ai l'exception suivante lors de l'appel .Update()

« DriverSafetyCheckTrigger ne peut pas être désérialisé, car il ne dispose pas d'un constructeur par défaut public »

Peut-être qui aidera ?

+0

Merci, mais je ne pense pas que ce soit le problème. Il avait l'habitude d'avoir un constructeur sans paramètre mais cela ne faisait aucune différence. Aussi, je n'essaie pas de sérialiser/désérialiser. Merci pour votre contribution de toute façon. –

+0

Excuses, c'était en fait le problème. Sharepoint doit essayer de sérialiser/désérialiser la classe pour une raison quelconque. Quoi qu'il en soit, l'ajout d'un constructeur sans paramètre à la classe DriverSafetyCheck a résolu le problème. –

+0

Une explication que je peux penser à la sérialisation/désérialisation nécessaire est parce que votre classe DriverSafteyCheckTrigger contient des données. Le champ pi_SiteUrl reçoit uniquement une valeur lorsque vous configurez le travail du minuteur, mais le travail du minuteur doit utiliser cette valeur chaque fois que le travail est exécuté. Si la sérialisation ne se produisait pas, pi_SiteUrl serait vide à chaque exécution du travail. –

0

J'ai un code similaire qui fonctionne dans un de mes récepteurs de fonction:

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

Je me demande si votre problème est le calendrier. Essayez de définir BeginMinute et peut-être aussi BeginSecond. Vous pouvez également essayer de définir les valeurs End en conjonction avec ou à la place des valeurs Begin.

Questions connexes