مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش زمانبندی و انجام کارهای تکراری بصورت خودکار در برنامه وب

حالتی را در نظر بگیرید که شما در وب سایت خود باید یک سری فایل ها را حذف کنید و یا هر یک ساعت یک بار برای مدیر ایمیل بفرستید و یا داده های خود را آرشیو کنید. در کل اگر بخواهید در وب سایت خود در بازه های زمانی یک کار تکراری را انجام بدهید چه کاری باید انجام دهید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

انجام این کار در برنامه نویسی دسکتاپ بسیار آسان است. شما یک Thread می سازید و یا از تایمر استفاده می کنید ولی در وب نمی توان به همین راحتی عمل زمان بندی را انجام داد. در این آموزش روشی را به شما یاد می دهیم که با کمک آن بتوانید در سایت های asp.net یک کار تکراری را در بازه های مختلف انجام دهید. با استفاده از این روش شما می توانید یک کار را هر روز و یا هر ساعت یا هر دقیقه و بازه های زمانی دیگر انجام دهید. برای این کار مراحل زیر را برای ساخت یک پروژه با ما همراهی کنید.

ساخت پروژه

در ابتدا ویژوال استودیو را باز کرده و از منوی file بر روی new و سپس project کلیک می کنیم. در این صورت پنجره ای باز می شود که اجازه انتخاب نوع پروژه را به شما می دهد. مانند شکل زیر

وب سایت توسینسو

در این صفحه مانند عکس از سمت چپ web را انتخاب کنید و از بخش سمت راست Asp.Net Web Application را انتخاب کنید. دقت داشته باشید که در این آموزش ما از زبان سی شارپ استفاده می کنیم. یک نام برای پروژه در پایین پنجره انتخاب کنید و بر روی OK کلیک کنید. در این صورت یک صفحه مانند عکس زیر ظاهر خواهد شد که شما می توانید نوع پروژه را انتخاب کنید که می توانید از انواع پروژه های Asp.Net که web form, mvc , web api می باشد انتخاب کنید. مهم نیست که نوع پروژه ای که انتخاب می کنید کدام باشد. برای مثال ما در این پروژه نوع MVC را انتخاب می کنیم و بر روی ok کلیک می کنیم.

وب سایت توسینسو

در این حالت پروژه شروع به ساخته شدن خواهد کرد و فایل های مورد نیاز ساخته می شود. بعد از این که پروژه ساخته شد لیست فایل ها به شکل زیر خواهد بود

وب سایت توسینسو

افزودن بسته ها

برای این که امکان زمانبندی به پروژه اضافه شود باید بسته quartz.net را بر روی پروژه نصب کنیم. برای این کار در پنجره solution explorer که عکس آن را در بالا می بینید بر روی نام پروژه کلیک راست کنید و Manage Nuget Packages را انتخاب کنید. تا پنجره زیر باز شود.

وب سایت توسینسو

در این تصویر بسته هایی که بر روی پروژه شما نصب شده است نشان داده می شود و اگر آپدیتی برای هرکدام ارایه شده باشد نشان داده می شود. حال برای این که quartz را نصب کنیم به tab اولی یعنی browse می رویم و در قسمت سرچ عبارت quartz.net را جستجو کنید. دقت کنید که به اینترنت متصل باشید. بعد از این که جستجو کردید نتیجه جستجو به شما نشان داده می شود که بر روی اولین بسته کلیک کنید و از سمت راست گزینه install را انتخاب کنید. در این حالت فرایند نصب شروع خواهد شد و بسته ها دانلود شده و بر روی پروژه شما نصب می شوند. بعد از این که فرایند نصب تکمیل شد صفحه بسته های شما به شکل زیر خواهد شد

وب سایت توسینسو

این شکل بیان می کند که بسته نصب شده است زیرا که روی quartz تیک سبز رنگ خوده است.

شروع برنامه نویسی با quartz

پس از نصب بسته ها نوبت به برنامه نویسی می رسد. بسته quartz سه بخش دارد. Job, trigger, scheduler که با استفاده از این بخش ها عمل زمان بندی را انجام می دهیم. Job کاری است که باید انجام شود. Trigger مشخص می کند که چه زمانی و با چه فاصله زمانی عمل ما تکرار شود. Job , trigger باهم در داخل scheduler قرار می گیرند. یک job یک کلاس است که از اینترفیس IJob ارث بری می کند. این اینترفیس یک متد به نام execute دارد که باید پیاده سازی شود. برای مثال ما می خواهیم یک برنامه بنویسیم که هر چند دقیقه یک بار یک ایمیل ارسال کند و تاریخ ارسال ایمیل را در فایل بنویسد برای همین یک کلاس در پروژه می سازیم و نام آن را EmailJob قرار می دهیم. برای این کار بر روی پروژه کلیک راست می کنیم و Add و سپس گزینه آخر که class است را انتخاب کرده و نام آن را EmailJob قرار می دهیم و بر روی ok کلیک می کنیم. حال کلاس ما ساخته می شود. کد کلاس را باید به شکل زیر تغییر دهیم

namespace WebApplication1
{
    using System;

    using Quartz;
    public class EmailJob:IJob
    {
        public void Execute(IJobExecutionContext context)
        {
        }
    }
}

حال باید متد Execute را پیاده سازی کنیم. گفتیم که می خواهیم یک ایمیل ارسال کنیم و زمان ارسال را در فایل ذخیره کنیم. برای این کار کد زیر را می نویسیم

public void Execute(IJobExecutionContext context)
        {
            using (var message = new MailMessage("user@gmail.com", "user@live.co.uk"))
            {
                message.Subject = "Test";
                message.Body = "Test at " + DateTime.Now;
                using (var client = new SmtpClient
                {
                    EnableSsl = true,
                    Host = "smtp.gmail.com",
                    Port = 587,
                    Credentials = new NetworkCredential("user@gmail.com", "password")
                })
                {
                    client.Send(message);
                }
               
            }
            File.AppendAllText("time.data", DateTime.Now.ToString("F"));
        }

دقت کنید که اطلاعاتی که ما برای ایمیل دادیم اطلاعات تستی بوده و کار نمی کند ولی شما اگر اطلاعات درست وارد کنید مشکل حل خواهد شد. حال باید یک scheduler هم بسازیم. برای این کار یک کلاس دیگر به نام MyScheduler در پروژه می سازیم. در این کلاس هم باید job را مشخص کنیم و هم باید trigger را بسازیم. برای این کار ما یک متد به نام Start تعریف کرده ایم که کد آن به شکل زیر خواهد بود

using Quartz;
using Quartz.Impl;

namespace WebApplication1
{
    public class MyScheduler
    {
        public static void Start()
        {
            var scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
            var job = JobBuilder.Create<EmailJob>().Build();
            var trigger = TriggerBuilder.Create()
                .WithDailyTimeIntervalSchedule(
                    builder =>
                        builder.WithIntervalInMinutes(10)
                            .OnEveryDay()
                            .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))).Build();
            scheduler.ScheduleJob(job, trigger);
        }
    }
}

در کد بالا یک scheduler تعریف کرده ایم و آن را استارت کرده ایم. سپس job را مشخص کرده ایم که گفته ایم از EmailJob یک job ساخته شود. سپس یک Trigger ساخته ایم که می گوییم هر روز و هر 10 دقیقه یک بار اجرا شود و هر روز از ساعت 00:00 شروع به کار نماید. در انتها هم گفته ایم که scheduler شروع به کار کند.حال بعد از این که این کار ها را انجام دادیم باید کل Scheduler را در یک قسمت روشن کنیم. برای این کار ما باید در فایل global زمانبند را روشن کنیم برای این کار باید فایل Global.asax را باز کنیم و کد زیر را به متد Application_start اضافه کنیم.

MyScheduler.Start();

که کد این فایل به شکل زیر خواهد شد.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            MyScheduler.Start();
        }
    }
}

به همین سادگی!! البته شاید ارسال ایمیل به خاطر اطلاعات نادرست خطا بدهد ولی نوشتن در فایل به درستی انجام خواهد گرفت. برای این که به فایل time.data دسترسی داشته باشید باید به مسیر

C:\program files (x86)\IIS Express

بروید خواهید دید که تاریخ ها ثبت می شود پس برنامه به درستی کار می کند. امید وارم که از این آموزش استفاده کرده باشید.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات