ایجاد Timer job در شیرپوینت 2013

دسته: توسعه شیرپوینت نوشته شده توسط شهاب مطاع پور
ایجاد timer job در sharepoint

تایمرجاب یک وظیفه ای است که به صورت دوره ای در سرور شیرپوینت اجرا می‌شود ، در حقیقت تایمر جاب ها می توانند وظایف متعددی را در بستر شیرپوینت راس زمان بندی میعنی و براساس رویداد خاصی راجرا نمایند.

تایمر جاب (Timer job) شیرپوینت چیست ؟
تایمرجاب یک وظیفه ای است که به صورت دوره ای در سرور شیرپوینت اجرا می‌شود ، در حقیقت تایمر جاب ها می توانند وظایف متعددی را در بستر شیرپوینت راس زمان بندی میعنی و براساس رویداد خاصی راجرا نمایند. قبل از شروع کار به Site Content رفته و یک Custom list با نام TimerLists ایجاد می‌کنیم
نحوه ایجاد Timer job به صورت مرحله به مرحله
- ابتدا ویژوال استودیو را (به صورت Run As Administrator ) باز می‌کنیم
- سپس با استفاده از گزینه New Project یک Empty Sharepoint Solution ایجاد می‌نماییم
ایجاد تایمرجاب

 - سپس گزینه Deploy As Farm Solution را انتخاب می‌نماییم

ایجاد تایمرجاب

- برروی نام پروژه راست کلیک کرده و از گزینه Add سپسItem  New و بعد Class یک کلاس به پروژه مان اضافه میکنیم و نام آنرا (TimerJobDemo.cs  ) قرار می‌دهیم

Add -> New Item -> Class

- در کلاس مان کتابخانه های 

using Microsoft.SharePoint;  
using Microsoft.SharePoint.Administration;

using مینماییم، سپس خود کلاس مان باید از کلاس SPJobDefinition ارث بری کند به شکل زیر

using Microsoft.SharePoint;  
using Microsoft.SharePoint.Administration;  
public class TimerJobDemo:SPJobDefinition  
{  
}  

توجه داشته باشید که کلاس مذکور را public کردیم .
- اینکه باید سه مدل constructor زیر را به کلاسی که در مرحله قبل ایجاد کردیم اضافه نماییم

public TimerJobDemo() : base()
{
}
public TimerJobDemo(string jobName, SPService service) : base(jobName, service, null, SPJobLockType.None)
{
	this.Title = "تایمر جاب دمو";
}
public TimerJobDemo(string jobName, SPWebApplication webapp) : base(jobName, webapp, null, SPJobLockType.ContentDatabase)
{
	this.Title = "تایمر جاب دمو";
}

 - سپس متد Execute را باید به انتهای کلاس مان اضافه کنیم ، به این ترتیب هر موقع timer job اجرا شود کدهای داخل متد Execute نیز اجرا خواهد شد

public override void Execute(Guid targetInstanceId)
{
	SPWebApplication webApp = this.Parent as SPWebApplication;
	SPList taskList = webApp.Sites[0].RootWeb.Lists["TimerLists"];
	SPListItem newTask = taskList.Items.Add();
	newTask["Title"] = "زمان اجرای تایمر جاب " + DateTime.Now.ToString();
	newTask.Update();
}

 رجیستر نمودن Timer job
به منظور رجیستر نمودن Timer job مراحل زیر را دنبال نمایید،
- در این مرحله یک feature به سولوشن مان اضافه میکنیم 

 اضافه نمودن فیچر

 

- فیچر اضافه شده را تغییر نام نموده (Rename) و نام آنرا به TimerJobFeature تغییر می‌دهیم
- در صورت تمایل در بخش Description توضیحاتی برای کاربرانی که از این فیچر استفاده میکنند ( عموما ادمین شیرپوینت ) قرار می‌دهیم
- سپس Scope اجرا این فیچر را برروی WebApplication تنظیم می‌کنیم

 ایجاد timer job

 - از قسمت Properties در ویژوال استودیو وارد بخش Feature properties می‌شویم و گزینه “Active On Default” برروی False ست می‌نماییم این کار باعث میشود بعد دیپلوی ما بلافاصله تایمر جاب اجرا نشود و توسط ادمین فعال گردد. 

 ایجاد timer job

 - اینک برروی فیچر TimerJobFeature راست کلیک نموده و گزینه Add Event Receiver را انتخاب می‌نماییم 

 ایجاد timer job

 - سپس از ویژوال استودیو برروی فایل feature1.EventReciever.cs کلیک می‌کنیم و متدهای FeatureActivated و FeatureDeactivating را uncomment نموده ( با حذف // از ابتدای نام متد ) و داخل متدهای کدهای زیر را کپی می نماییم ، توجه فرمایید بسته به نیازمان باید event receiver را را impleament نماییم در این مثال ما می‌خواهیم با رعایت سطوح دسترسی هنگامیکه فیچر فعال و غیر فعال میشود تایمر جاب مان نیز به ترتیب فعال و غیر فعال شود. 

 

const string JobName = "Demo Job";
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate ()
                {
                    SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
                    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;
                }
            }
        }

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

        private bool CreateJob(SPWebApplication site)
        {
            bool jobCreated = false;
            try
            {
                TimerJobDemo job = new TimerJobDemo(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;
        }

دیپلوی و دیباگ نمودن تایمرجاب ( Deploy and Debug )
- برروی نام سولوشن در ویژوال استودیو راست کلیک نموده و گزینه deploy انتخاب نمایید
- بعد از دیپلوی موفق سولوشن در شیرپوینت باید فیچر مربوطه را Active نماییم از آنجایی که scope اجرای این سولوشن در سطح web application است به منظور فعال سازی فیچرمان باید به Central Administration شیرپوینت برویم
- پس باز کردن central administration گزینه Manage Web Application را انتخاب می‌نماییم

ایجاد تایمرجاب

 - سپس Web Application مورد نظرتان را انتخاب نمایید و گزینه Manage Feature را از ریبون بالا انتخاب نمایید 

ایجاد تایمرجاب

 - اینک یک پنجره به صورت Pop up باز می‌شود و در آن تمام فیچرهایی که در Scope مربوط به Web application قابل فعال شدن / غیرفعال شدن هستند را به شما نمایش می‌دهد ، فیچری که در مراحل قبل ایجاد کردیم (TimerJobFeature) را پیدا کرده و آنرا Active نمایید

رجیستر تایمرجاب

 بعد از Active نمودن فیچر ، تایمرجاب مان register خواهد شد . به منظور مشاهده تمام  Timer job های رجیستر شده از Central Administration گزینه Monitoring و سپس گزینه Review Job Definitions را انتخاب میکنیم 

رجیستر تایمرجاب

 - در این مرحله می توان با انتخاب Web Application و پیدا نمودن Timer job ای که در مراحل قبل آنرا رجیستر کردیم ، پیدا نموده و برروی آن کلیک کرده و زمانبندی مناسب مثلا روزانه ، هفتگی و ... برای آن تایمر جاب تنظیم نموده روی دکمه Ok کلیک کنیم ، به منظور اجرای آنی تایمر جاب می توان از گزینه Run now استفاده نمود

استارت تایمرجاب

 نحوه دیباگ گردن timer job
- به منظور دیباگ کردن تایمرجاب ما باید در متد Execute() که در مراحل قبل ایجاد کردیم حداقل یک break point قرار دهیم و سپس از منوی Debug ویژوال استودیو گزینه Attach to process را انتخاب کنیم (کلید میانبر CTRL+ALT+P) و آنرا به process با نام OWSTIMER.EXE اتچ نماییم

استارت تایمرجاب

 در نهایت باید خروجیه کارمان در لیستی که در ابتدا ایجاد کردیم مشاهده کنیم 

استارت تایمرجاب