درخواست های ارتباط
جستجو تنظیمات
لیست دوستان من

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب

3 نظرات

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


ساخت پروژه


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

Image

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

Image

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

Image


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


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

Image

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

Image

این شکل بیان می کند که بسته نصب شده است زیرا که روی 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\

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

ITPRO باشید

نویسنده: مهدی عادلی فر

منبع: Itpro

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

آیا این مطلب را پسندیدید؟

برای ارسال نظر ابتدا به سایت وارد شوید

arrow