Asp.net Core

اجرای کارهای زمانبندی شده در Asp.net Core | اجرای کارهای پس زمینه در Asp Core

در بسیاری از پروژه ها و سایت هایی که طراحی میکنیم نیاز به اجرای کارهای زمانبندی شده داریم. منظور کارهایی است که در زمان خاصی باید اجرا شوند مثلا ارسال پیامک به گروه خاصی از کاربران هر روز ساعت 10 صبح باید انجام شود. در ادامه نحوه اجرای کارهای زمانبندی شده در Asp.net Core را آموزش میدهیم.

 

کارهای پس زمینه یا کارهای زمان بندی شده وظایفی هستند که باید توسط سیستم و بصورت خودکار انجام شده و اجرا شوند. بعنوان مثال میتوان به موارد زیر اشاره کرد:

  • ارسال ایمیل یا پیامک به کاربرانی که میزا شارژ حساب آنها کمتر از هزار تومان شده است.
  • یا گرفتن بک آپ از بانک سایت هر روز ساعت 8 صبح
  • یا ارسال پیامک به بیمه گذارانی که 3 روز دیگر بیمه آنها نیاز به تمدید دارد.

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

کارهایی از این دست را بعنوان کارهای پس زمینه نیز میشناسند. حال اگر شما سایت خود را با Asp.net Core طراحی کرده اید بهتر است بدانید که Asp Core از زمان ASP.NET Core 2.1، قابلیت جدیدی به نام Generic Host را اضافه کرد که میتوان از آن برای اجرای کارهای پس زمینه متداول مانند ارسال ایمیل در خبرنامه ، یا ارسال پیامک یا نسخه پشتیبان و … استفاده کرد.

در ادامه نحوه پیاده سازی وظایف زمان بندی شده در Asp.net core را گام به گام توضیح میدهیم.

 

فرض میکنیم که شما یک سرویس نوشته اید که ارسال ایمیل یا پیامک را انجام میدهد ، حال میخواهید این سرویس را بصورت زمان بندی شده فراخوانی کنید. برای سادگی فرض میکنیم که شما تابعی بنام Test() را میخواهید بصورت زمان بندی شده اجرا کنید. این تابع میتوان هر چیزی باشد که شما در برنامه تان نیاز دارید که انجام دهید .

گام اول برای اجرای کارهای زمانبندی شده در Asp.Net Core

برای اجرای تابع Test بصورت زمانبدی و توکار نیاز است که ابتدا دو کلاس زیر را در برنامه خود اضافه کنید:

کلاس فوق ، از کلاس BackgroundService ارث بری کرده است که این کلاس نیز خود اینترفیس IHostedService را پیاده سازی کرده است و امکانی است که بصورت توکار در Asp Core قرار گرفته است تا کارهای پس زمینه را اجرا کنیم.

 

گام دوم برای اجرای کارهای زمانبندی شده در Asp.Net Core

IHostedServiceها با طول عمر singleton به سیستم تزریق وابستگی‌ها معرفی می‌شوند. در این حالت اگر سرویس‌هایی با طول عمر transient و یا scoped را به آن‌ها تزریق کنید، دیگر طول عمر مدنظر شما را نداشته و آن‌ها هم به صورت singleton عمل خواهند کرد. یک چنین مواردی را به صورت زیر با تزریق IServiceScopeFactory و ساخت صریح یک Scope می‌توان مدیریت کرد.

در ادامه کلاس زیر را نیز اضافه کنید که این کلاس به ما کمک میکند تا تزریق وابستگی DbContext برنامه در یک سرویس کار پس‌زمینه را نیز پشتیبانی کنیم.

علاوه بر این چون ما میخواهیم که وظیفه یا متد مورد نظر ما بصورت متوالی در روزهای مختلف فراخوانی و اجرا شود ، برای این کار از کتابخانه NCrontab استفاده کرده ایم. برای نصب این پکیج نیز میتوانید از دستور زیر استفاده کنید:

و کلاس زیر را به برنامه خود اضافه کنید:

ما کلاس بعدی یعنی کلاس سرویس وظیفه را از  کلاس فوق مشتق میکنیم تا بتوانیم کارهای پس‌زمینه‌ ای که به تزریق سرویس‌هایی با طول عمر Scoped یا Transient نیاز دارند را نیز ساپورت کنیم.

به این ترتیب serviceProvider ای که در در اختیار مصرف کننده قرار می‌گیرد، داخل Scope قرار دارد و توسط آن می‌توان سرویس‌های مدنظر را توسط متدهایی مانند serviceProvider.GetRequiredService، دریافت کرد. در ادامه این مورد را می بینیم:

گام سوم برای اجرای کارهای زمانبندی شده در Asp.Net Core

پیاده سازی کلاس سرویس وظیفه

حال نیاز است که کلاسی را برای فراخوانی متد test یا هر متد دیگری که میخواهید بصورت زمان بندی شده اجرا شود بنویسیم که این کلاس باید از کلاس ScheduledScopedBackgroundService مشتق شود و متد  ScheduledExecuteInScope را پیاده سازی کند :

ما کلاسی بنام AlertTask را ایجاد کرده ایم که در آن اینترفیسی بنام IAlarmService را از طریق متد serviceProvider.GetRequiredService به برنامه تزریق کرده ایم چرا که در برنامه ما ، ما قصد استفاده از سرویس alarmService را داشته ایم که تابع Test خود را که در این سرویس بود فراخوانی کنیم.

 

اما این متد کی و چه زمانی اجرا میشود؟

ما در کد فوق با تعریف زیر زمان اجرای متد رامشخص کرده ایم :

و به این معنی است که هر روز راس ساعت 16 و 31 دقیقه متد فوق بصورت خودکار اجرا میشود

عبارت فوق یک عبارت کورن است :

عبارات Cron، روش بسیار متداولی برای تعریف و انجام کارهای زمانبندی شده در سیستم‌های لینوکسی هستند.

برای مثال عبارت * * * 0 1 سبب اجرای یک وظیفه، هر روز یک دقیقه پس از نیمه‌شب، می‌شود و فرمت کلی 5 قسمتی آن، به صورت زیر است:

با تغییر رشته فوق میتوانید زمان اجرای متد را به دلخواه خود تغییر دهید.

 

با استفاده از دستور زیر نیز باید کار پس زمینه را به سیستم معرفی کنید:

 

کد فوق را باید در داخل فایل  Startup.cs برنامه خود در قسمت ConfigureServices اضافه کنید.

 

موفق باشید.

author-avatar

درباره حجت میرزائی

http://hojjatmirzaei.ir - مهندس کامپیوتر و دارای مدرک کارشناسی ارشد هوش مصنوعی هستم. - مدرس دانشگاه - علاقه شدیدی به هوش مصنوعی و کدنویسی Matlab دارم. - برنامه نویس و طراح وب سایت با تکنولوژی .Net هستم. - همچنین با CMSهایی مانند وردپرس کار میکنیم. عاشق سئو و متخصص سئوی وب سایت های شرکتی و ... .

یک فکر در مورد “اجرای کارهای زمانبندی شده در Asp.net Core | اجرای کارهای پس زمینه در Asp Core

  1. ami گفت:

    امکانش هست در زمان Run Time کرون Schedule رو عئض کرد ؟ مثلا از دیتابیس خوندش
    ممنون

  2. حسین گفت:

    با عرض سلام
    می خواستم بپرسم باید از کتابخانه ی خاصی برای کد زیر استفاده کرد
    PrinterHostedService
    چون این کد شناسایی نمیشه

    1. مهدی گفت:

      PrinterHostedService یک کلاس نمونه هست برای آموزش برادر

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *