دسته بندی ها
14:49 1399/08/25

ایجاد زمانبندی با quartz در Asp.net core

مشخصات سوال کننده :
کاربر : hosseinfullstack     امتیاز کاربر : 58     رتبه کاربر : 16
دسته بندی : Asp.net Core

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3506
هوش مصنوعی

پاسخ هوش مصنوعی

برای ایجاد یک زمانبندی با Quartz در ASP.NET Core که هر یک ساعت چک کند فاکتورهایی که نهایی و پرداخت نشده اند را آپدیت کند، شما نیاز دارید تا یک Job تعریف کنید و آن را به Quartz اضافه کنید. در زیر مثالی از نحوه پیاده سازی این کار آورده شده است.

ابتدا شما باید بسته ای به نام Quartz.AspNetCore را به پروژه خود اضافه کنید. این کار را می توانید با استفاده از NuGet Package Manager انجام دهید:

dotnet add package Quartz.AspNetCore

سپس یک کلاس برای Job خود ایجاد کنید:

using Quartz;
using System.Threading.Tasks;

public class UpdateOrderJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        // اینجا منطق آپدیت فاکتورها را قرار دهید
        // با دیتابیس کار کنید و فاکتورهای قدیمی تر از یک ساعت را آپدیت کنید
    }
}

سپس در Startup.cs، Quartz را پیکربندی کنید:

using Quartz;
using Quartz.Spi;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddQuartz(q =>
        {
            q.UseMicrosoftDependencyInjectionJobFactory();
            var jobKey = new JobKey("updateOrderJob");
            q.AddJob(opts => opts.WithIdentity(jobKey));
            q.AddTrigger(opts => opts
                .ForJob(jobKey) // همان Job که ساخته ایم
                .WithIdentity("updateOrderJob-trigger") // نام Trigger
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInHours(1) // هر یک ساعت یکبار
                    .RepeatForever()));
        });

        services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
    }
}

در مورد سؤال شما درباره فشار به سرور: اجرای یک Job هر یک ساعت می تواند کارا باشد و به نظر می رسد که فشار زیادی به سرور وارد نکند، به شرطی که منطق داخل Job بهینه باشد و از منابع بی مورد استفاده نکند.

اما در مورد سوال دوم شما، استفاده از قیمت های به روز هنگام نهایی کردن فاکتور می تواند ساده تر و کارآمدتر باشد. با این روش، شما همیشه قیمت های دقیق و به روز را دریافت می کنید و اسپکترهای احتمالی را کاهش می دهید. اما باید دقت کنید که این روش ممکن است موجب بار اضافی بر روی پایگاه داده شود، مخصوصا در زمان نهایی کردن فاکتور، که مثلاً چندین کاربر به طور همزمان اقدام به انجام این عمل می کنند.

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

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 03:39 1399/08/26

البته نظر دادن در مورد پروژه ای که هیچ اطلاعاتی در مورد اون پروژه و شرایط انجام اون پروژه نداشته باشی مطمئنا دقیق و کارشناسی نیست و صرفا میشه یک نظر کلی داد. اما به طور کلی Job ها وظایفی هستن که سرور باید طبق زمانبندی اون رو انجام بده. و مطمئنا این وظایف یک بار کم یا زیاد (بستگی به نوع Job) روی سرور داره. اما هر 2 ساعت یکبار بنظر نمیاد زیاد باشه و مشکلی نداره.

اما در مورد پروژه شما به نظر بنده اصلا نیازی به زمانبندی و تعریف Job نیست. شما می تونید سبد خرید کاربر رو قبل از نهایی کردن سبد مجدد کنترل کنید و اگر قیمت یک کالا تغییری کرده باشه یا اینکه موجودی اون کالا 0 شده به کاربر اطلاع بدید.

شما فرض کنید 100 کاربر بیان و کالاهایی رو در سبد خودشون قرار بدن و هیچ کدوم هم سر نزنن به سبدشون و خرید رو قطعی نکنن. دیگه چه نیازی هست که سیستم مرتبا بیاد و سبد کاربر رو چک کنه.

یک پیشنهاد : همیشه سخت ترین راه بهترین راه نیست.

به این پاسخ امتیاز بدهید    1
امتیاز: 1635 رتبه: 2
1 نظر
hosseinfullstack : بسیار ممنون دوست عزیز. تحقیق هایی که کردم متوجه شدم quartz فشار روی سرور میاره و معقول 24 ساعت و 48 ساعت هست. از setInterval جاوا اسکریپت استفاده کردم. که هنگام رفتن به صفحه سبد خرید، ما در مدل تاریخ انقضای فروش ویژه یا کد تخفیف رو داریم و با جاوا اسکریپت اون تاریخ رو میگیره و شروع به شمارش معکوس میکنه و به کاربر هم شمارش رو نشون میده، پس از تموم شدن انقضای اون تخفیف، صفحه مجدد لود میشه و طبیعتا وقتی لود میشه دیگه قیمت های آپدیت شده رو میگیره و قبل نهایی شدن هم قیمتی در فاکتور ثبت نمیشه بلکه صرفا آیدی محصول و... و کد تخفیف هم اگر استفاده کنه در جدول جداگانه ثبت میشه که اونم با تاریخش بررسی میکنه

امتیاز کاربر : 58   رتبه کاربر : 16   تاریخ ثبت : 04:05 1399/08/26
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود