Search This Blog

Wednesday, December 17, 2014

Step by Step procedures to create a Timer Job in SharePoint 201

Description:

In this article, we will see how to create a Timer Job step by step in SharePoint 2013.  Today I am going to create a timer job that will execute ever 15 minutes and creates task in task list of the SharePoint site which ever the site we activated the timer job feature.

What is a Timer Job?

A Timer Job is a periodically executed task inside SharePoint Server. It provides us a task execution environment. For example, we can execute tasks like: sending emails every hour, data updating every day, creating reports every week, etc.

From the above Figure: The Timer job will call execute method, inside of the execute method our main code snippet will create a task item in sharepoint task list.

Default Timer Jobs inside SharePoint:

There are many timer jobs inside SharePoint which do internal tasks like:
    • Send emails
    • Validate sites
    • Delete unused sites
    • Health analysis
    • Product versioning
    • Diagnostics
These tasks will having execution periods like:
    • Minute
    • Hour
    • Day
    • Week
    • Month
Components of Connectable web parts : 
  1. Derive CustomTimerJob Class from SPJobDefinition
  2. Add the three Constructors of the derived class : When ever we create the object of CustomTimerJob  class, corresponding constructor will execute.
  3. Override the Execute method: When ever the timer job start running then the code inside the Execute method will run.
  4. We need to create a Feature and Feature Receiver so on activation of this feature we are going the add our timer job to SharePoint farm.
Here is the following steps : 

Step 1: 

Click on create new project in start page of  Visual Studio 2013

Step 2:

Or You can create a new project by click on File -> New Project from top menu of Visual Studio 2013

Step 3:

  1. Chose the required template for our sharepoint projet. Click on Visual C#  because i used C# for my solution, if you want with Visual Basic you can select VB template
  2. Click on Office/SharePoint
  3. Click on SharePoint solutions
  4. Please select the .Net Framework  is : 4.5 from top menu of new project window. We can also select below 4.5 version because SharePoint 2013 is backward comparability.
  5. Please give a name of project in new project window, in my context project name: customtimerjob
  6. Click on Ok Button in the new project window

Step 4:

SharePoint Customization Wizard
  1. Provide the SharePoint Site url where you want deploy the project solution (i.e customtimerjob project ). In my contenxt : http://c4968397007
  2. Just cross check does the site is available to deploy the project solution or not  by just click on Validate button.
  3. Select the what is the trust level of SharePoint Solutions ? Select the farm solution.  You must select the Deploy as a farm solution radio button because timer jobs require a higher level of trust to execute than sandboxed solutions.

Step 5:


Step 6:

  1. Right Click on project and select add new item then add folder to the project solution ( this is for just convenient but not mandatory )
  2. In this folder i will add customtimerjob class of the project.

Step 7:

  1. Rename the folder, in my context it’s SPJobs

Step 8:

  1. Right click on SPJobs folder and select add new class
  2. Name it’s customtimerjob.cs

Step 9:


Step 10:

  1. Extend the customtimerjob class from SPJobDefinition.
  2. Add the three default constructors of SPJobDefinition class to cutomtimerjob.
  3. Over ride the Execute method in customtimerjob class.
  4. Our main code we will keep it in execute method of the customtimerjob.
Add the following code:

1234567891011121314151617181920212223242526272829303132333435363738
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
 
namespace customtimerjob.SPJobs
{
class SPTImerJobClass : SPJobDefinition
{
 
public SPTImerJobClass() : base() { }
 
public SPTImerJobClass(string jobName, SPService service): base(jobName, service, null, SPJobLockType.None)
{
this.Title = "Task Complete Timer";
}
 
public SPTImerJobClass(string jobName, SPWebApplication webapp): base(jobName, webapp, null, SPJobLockType.ContentDatabase)
{
this.Title = "Task Complete Timer";
}
 
public override void Execute(Guid targetInstanceId)
{
SPWebApplication webapp = this.Parent as SPWebApplication;
SPList tasklist = webapp.Sites[0].RootWeb.Lists["Tasks"];
SPListItem newTask = tasklist.Items.Add();
newTask["Title"] = "New Task" + DateTime.Now.ToString();
newTask.Update();
}
}
}
view rawSPTImerJobClass.cs hosted with ❤ by GitHub
   

Registering the Timer Job Definition:

Step 11:

    1. Right click on the Features folder of the project and select the option ” add a feature “


Step 12:

    1. Rename the above added feature to SPTimerJobFeature1 ( The name is up to you convenience) 


Step 13:

    1. Please select the scope of the feature as WebApplication so the solution will gain more control over all the site collection in web application, you want with differient scope you can chose based on your requirement.


Step 14:

    1. Change the Active on Default to False so that the customtimerjob will not active on the all web application by default.
    2. So what ever the Web Application we want to active the timer job, we will do it manually through the central admin.



Step 15:

    1. Now we are adding the feature receivers to feature.
    2. Right click on the SPTimerJobFeature1 and select the add event receiver option



Step 16:

    1. if you observer here the SPTimerjobFeature1EventReceiver class extends the SPFeatureReceiver class


Step 17:

By defualt all the Methods are commented out, un-comment the methods that you want and add the code inside the method
    1. FeatureActivated
    2. FeatureDeactivating
    3. FeatureInstalled
    4. FeatureUninstalling
    5. FeatureUpgrading



Step 18:


12345678910111213141516
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
SPSite site = properties.Feature.Parent as SPSite;
DeleteExistingJob(JobName, parentWebApp);
CreateJob(parentWebApp);
});
}
catch(Exception ex){
throw ex;
}
}
view rawFeatureActivated.cs hosted with ❤ by GitHub
  1. In the FeauteActivated method i added code
  2. In the Line No : 5  i used SPSecurity.RunWithElevatedPrivileges for getting admin privileges for this particular task
  3. In the Line No : 7 & 8 i create objects for the web application and site
  4. In Line No: 8 i called a method DeleteExistingJob(JobName, parentWebApp); this is a user defined method. In this method will check the whether any job exist in SharePoint Farm with JobName  if so this method i will delete the particular job because to maintain consistency.
  5. In Line No: 9 i called a method CreateJob(parentWebApp); this is a user defined method. In this method will create a SPTImerJobClass object and attached to SPMinuteSchedule so that on Every 15 minutes the SPMinuteScheduler will call Execute method of our customTimer Job:
1234567891011121314151617181920
private bool CreateJob(SPWebApplication site)
{
bool jobCreated = false;
try
{
SPTImerJobClass job = new SPTImerJobClass(JobName, site);
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 15;
job.Schedule = schedule;
job.Update();
}
catch (Exception)
{
return jobCreated;
}
return jobCreated;
}
view rawCreateJob.cs hosted with ❤ by GitHub

Add the following code in  
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using customtimerjob.SPJobs;
 
namespace customtimerjob.Features.SPTimerjobFeature1
{
/// <summary>
/// This class handles events raised during feature activation, deactivation, installation, uninstallation, and upgrade.
/// </summary>
/// <remarks>
/// The GUID attached to this class may be used during packaging and should not be modified.
/// </remarks>
 
[Guid("7d8c815c-b13d-4cbe-8fe9-4d0c2f5087ef")]
public class SPTimerjobFeature1EventReceiver : SPFeatureReceiver
{
const string JobName = "SP Task Timer";
// Uncomment the method below to handle the event raised after a feature has been activated.
 
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
SPSite site = properties.Feature.Parent as SPSite;
DeleteExistingJob(JobName, parentWebApp);
CreateJob(parentWebApp);
});
}
catch(Exception ex){
throw ex;
}
}
 
 
// Uncomment the method below to handle the event raised before a feature is deactivated.
 
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
lock (this)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
DeleteExistingJob(JobName, parentWebApp);
});
}
catch (Exception ex)
{
throw ex;
}
}
}
 
private bool CreateJob(SPWebApplication site)
{
bool jobCreated = false;
try
{
SPTImerJobClass job = new SPTImerJobClass(JobName, site);
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 15;
job.Schedule = schedule;
 
job.Update();
}
catch (Exception)
{
return jobCreated;
}
return jobCreated;
}
public bool DeleteExistingJob(string jobName, SPWebApplication site)
{
bool jobDeleted = false;
try
{
foreach (SPJobDefinition job in site.JobDefinitions)
{
if (job.Name == jobName)
{
job.Delete();
jobDeleted = true;
}
}
}
catch (Exception)
{
return jobDeleted;
}
return jobDeleted;
}
}
}

Step 19:

We are ready to deploy our solutions just right click on the project select the deploy option so the visual studio do the reaming background steps
BackGround Steps are mentioned in the step 20

Step 20:

BackGround Step happenes once we pass the deploy command to visual studio:
  1. It will build a one .dll (Dynamic Link Library)  and one .wsp ( Windows Sharepoint ) file for the package.
  2. Recycle ISS Application Pool : Skipped because it’s first we are deploying the package or project solution.
  3. Retract Solution: Skipped because it’s first we are deploying the package
  4. Add Solution: Done
  5. Deploy Solution: Done
  6. Activate Features: Skipped because we  have given an option Active Default to False in the step 14 so we need to active the feature manually.

Step 21:

Now we are going to active our customtimerjob feature :
  1. Open the Central Admin.
  2. In the Application Management click  on Manage Web Applications.

Step 22:

  1. Select the web application.
  2. Click on Manage features at top right corner of the web page.

Step 23:

  1. You will get a pop window show all the features are associalted with web application.
  2. Here we will find our customtimerjob named as SPTimerJobFeature1 and click on Active that’s it.

Step 24:


Step 25:

If you see here the timer job has been created a item in the task list of SharePoint Site

No comments:

Post a Comment