Προγραμματισμός

Πώς να προγραμματίσετε εργασίες χρησιμοποιώντας το Quartz.NET στο ASP.NET Core

Όταν εργάζεστε σε εφαρμογές Ιστού, συχνά θα πρέπει να εκτελείτε συγκεκριμένες εργασίες στο παρασκήνιο. Σε ορισμένες περιπτώσεις, αυτές θα είναι εργασίες που πρέπει να εκτελούνται σε προκαθορισμένα χρονικά διαστήματα.

Το Quartz.NET είναι μια θύρα ανοιχτού κώδικα .NET του δημοφιλούς πλαισίου προγραμματισμού εργασιών Java. Χρησιμοποιείται εδώ και πολύ καιρό και παρέχει εξαιρετική υποστήριξη για εργασία με εκφράσεις Cron. Μπορείτε να μάθετε περισσότερα για το Quartz.NET από προηγούμενη ανάρτηση εδώ.

Αυτό το άρθρο παρουσιάζει μια συζήτηση για το πώς μπορούμε να εργαστούμε με το Quartz.NET στο ASP.NET Core για τον προγραμματισμό εργασιών στο παρασκήνιο.

Για να εργαστείτε με τα παραδείγματα κώδικα που παρέχονται σε αυτό το άρθρο, θα πρέπει να έχετε εγκαταστήσει το Visual Studio 2019 στο σύστημά σας. Εάν δεν έχετε ήδη αντίγραφο, μπορείτε να κατεβάσετε το Visual Studio 2019 εδώ.

Δημιουργήστε ένα έργο ASP.NET Core API

Πρώτα απ 'όλα, ας δημιουργήσουμε ένα έργο ASP.NET Core στο Visual Studio. Ας υποθέσουμε ότι το Visual Studio 2019 είναι εγκατεστημένο στο σύστημά σας, ακολουθήστε τα βήματα που περιγράφονται παρακάτω για να δημιουργήσετε ένα νέο έργο ASP.NET Core στο Visual Studio.

  1. Εκκινήστε το Visual Studio IDE.
  2. Κάντε κλικ στο "Δημιουργία νέου έργου".
  3. Στο παράθυρο "Δημιουργία νέου έργου", επιλέξτε "ASP.NET Core Web Application" από τη λίστα των προτύπων που εμφανίζονται.
  4. Κάντε κλικ στο Επόμενο.
  5. Στο παράθυρο "Διαμόρφωση του νέου έργου" που εμφανίζεται στη συνέχεια, καθορίστε το όνομα και την τοποθεσία για το νέο έργο.
  6. Κάντε κλικ στο Δημιουργία.
  7. Στο παράθυρο "Δημιουργία νέας εφαρμογής ASP.NET Core Web", επιλέξτε .NET Core ως χρόνο εκτέλεσης και ASP.NET Core 2.2 (ή μεταγενέστερη έκδοση) από την αναπτυσσόμενη λίστα στην κορυφή. Θα χρησιμοποιήσω το ASP.NET Core 3.0 εδώ.
  8. Επιλέξτε "API" ως πρότυπο έργου για να δημιουργήσετε μια νέα εφαρμογή ASP.NET Core API.
  9. Βεβαιωθείτε ότι τα πλαίσια ελέγχου "Ενεργοποίηση υποστήριξης Docker" και "Διαμόρφωση για HTTPS" δεν είναι επιλεγμένα, καθώς δεν θα χρησιμοποιούμε αυτές τις δυνατότητες εδώ.
  10. Βεβαιωθείτε ότι ο Έλεγχος ταυτότητας έχει οριστεί ως "Χωρίς έλεγχο ταυτότητας", καθώς ούτε θα χρησιμοποιούμε έλεγχο ταυτότητας.
  11. Κάντε κλικ στο Δημιουργία.

Αυτό θα δημιουργήσει ένα νέο έργο ASP.NET Core API στο Visual Studio. Επιλέξτε το φάκελο Controllers solution στο παράθυρο Solution Explorer και κάντε κλικ στο "Add -> Controller ..." για να δημιουργήσετε ένα νέο χειριστήριο με το όνομα DefaultController.

Στη συνέχεια, για να εργαστείτε με το Quartz, θα πρέπει να εγκαταστήσετε το πακέτο Quartz από το NuGet. Μπορείτε να το κάνετε είτε μέσω του διαχειριστή πακέτων NuGet στο Visual Studio 2019 IDE είτε εκτελώντας την ακόλουθη εντολή στην κονσόλα διαχειριστή πακέτων NuGet:

Εγκατάσταση πακέτου χαλαζία

Εργασίες Quartz.NET, σκανδάλη και προγραμματιστές

Οι τρεις κύριες έννοιες του Quartz.NET είναι εργασίες, ενεργοποιητές και προγραμματιστές. Μια εργασία περιέχει τον κωδικό για την εκτέλεση μιας εργασίας ή μιας εργασίας που θα εκτελεστεί. Μια εργασία αντιπροσωπεύεται από μια κλάση που εφαρμόζει τη διασύνδεση IJob. Μια σκανδάλη χρησιμοποιείται για τον καθορισμό του χρονοδιαγράμματος και άλλων λεπτομερειών μιας εργασίας. Μπορείτε να επωφεληθείτε από μια σκανδάλη για να καθορίσετε τον τρόπο εκτέλεσης της εργασίας. Ο προγραμματιστής είναι το στοιχείο που είναι υπεύθυνο για την ψηφοφορία και την εκτέλεση εργασιών βάσει προκαθορισμένων προγραμμάτων.

Δημιουργήστε έναν προγραμματιστή χρησιμοποιώντας το Quartz.NET

Θα πρέπει να σημειωθεί ότι μπορείτε να έχετε πολλούς προγραμματιστές σε μια εφαρμογή. Ωστόσο, θα χρησιμοποιήσουμε μόνο έναν προγραμματιστή εδώ για λόγους απλότητας. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να δημιουργήσετε μια παρουσία προγραμματιστή.

var scheduler = StdSchedulerFactory.GetDefaultScheduler (). GetAwaiter (). GetResult ();

Μόλις δημιουργηθεί ο προγραμματιστής, μπορείτε να χρησιμοποιήσετε τον ακόλουθο κώδικα στη μέθοδο ConfigureServices του αρχείου Startup.cs για να προσθέσετε την παρουσία προγραμματιστή ως υπηρεσία singleton.

υπηρεσίες.AddSingleton (scheduler);

Ξεκινήστε και σταματήστε έναν προγραμματιστή χρησιμοποιώντας το Quartz.NET

Για να ξεκινήσετε και να σταματήσετε τον προγραμματιστή, θα εκμεταλλευτούμε μια υπηρεσία φιλοξενίας. Για να το κάνετε αυτό, πρέπει να δημιουργήσετε μια κλάση που εφαρμόζει τη διεπαφή IHostingService, όπως φαίνεται στο απόσπασμα κώδικα που δίνεται παρακάτω.

δημόσια τάξη CustomQuartzHostedService: IHostedService

{

ιδιωτικό αναγνωρισμένο IScheduler _scheduler;

δημόσια CustomQuartzHostedService (προγραμματιστής IScheduler)

        {

_scheduler = προγραμματιστής;

        }

public async Εργασία StartAsync (CancellationToken ακύρωσηToken)

        {

περιμένετε _scheduler;. Έναρξη (CancellationToken);

        }

public async Task StopAsync (CancellationToken ακύρωσηToken)

        {

περιμένετε _scheduler;. Τερματισμός λειτουργίας (CancellationToken);

        }

 }

Σημειώστε ότι πρέπει να καταχωρίσετε την φιλοξενούμενη υπηρεσία στη συλλογή υπηρεσιών στη μέθοδο ConfigureServices χρησιμοποιώντας το απόσπασμα κώδικα που δίνεται παρακάτω.

υπηρεσίες.AddHostedService ();

Εδώ είναι η ενημερωμένη μέθοδος ConfigureServices για την αναφορά σας:

public void ConfigureServices (υπηρεσίες IServiceCollection)

{

υπηρεσίες.AddControllers ();

var scheduler =

StdSchedulerFactory.GetDefaultScheduler (). GetAwaiter (). GetResult ();

υπηρεσίες.AddSingleton (scheduler);

υπηρεσίες.AddHostedService ();

}

Δημιουργήστε μια εργασία χρησιμοποιώντας το Quartz.NET

Όπως είπα νωρίτερα, μια εργασία είναι μια τάξη που εφαρμόζει τη διασύνδεση IJob και περιέχει τη μέθοδο Execute (). Η μέθοδος Execute () δέχεται μια παρουσία τύπου IJobExecutionContext.

Το παρακάτω απόσπασμα κώδικα απεικονίζει μια κλάση εργασίας που περιέχει μια ασύγχρονη μέθοδο εκτέλεσης (). Αυτή η μέθοδος περιέχει τον κωδικό που αντιστοιχεί στην εργασία που πρέπει να εκτελέσει η εργασία σας.

[DisallowConcurrentExecution]

δημόσια τάξη NotificationJob: IJob

    {

ιδιωτικό αναγνωστικό ILOGger _logger;

public NotificationJob (καταγραφέας ILogger)

        {

_logger = καταγραφέας;

        }

δημόσια εκτέλεση εργασιών (περιβάλλον IJobExecutionContext)

        {

_logger.LogInformation ("Γεια σου κόσμος!");

επιστροφή Task.CompletedTask;

        }

    }

Δημιουργήστε ένα εργοστάσιο εργασίας χρησιμοποιώντας το Quartz.NET

Ένα εργοστάσιο εργασίας είναι μια τάξη που κληρονομεί τη διασύνδεση IJobFactory και εφαρμόζει τις μεθόδους NewJob () και ReturnJob (). Το ακόλουθο απόσπασμα κώδικα μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας εργοστασιακής κλάσης που μπορεί να δημιουργήσει και να επιστρέψει μια παρουσία εργασίας.

δημόσια τάξη CustomQuartzJobFactory: IJobFactory

    {

ιδιωτικό readonly IServiceProvider _serviceProvider;

δημόσιο CustomQuartzJobFactory (IServiceProvider serviceProvider)

        {

_serviceProvider = serviceProvider;

        }

δημόσιο IJob NewJob (TriggerFiredBundle triggerFiredBundle,

Προγραμματιστής IScheduler)

        {

var jobDetail = triggerFiredBundle.JobDetail;

επιστροφή (IJob) _serviceProvider.GetService (jobDetail.JobType);

        }

δημόσιο κενό ReturnJob (εργασία IJob) {}

    }

Λάβετε υπόψη ότι αυτή η εφαρμογή δεν εκμεταλλεύεται τη συγκέντρωση θέσεων εργασίας. Εάν θέλετε να χρησιμοποιήσετε τη συγκέντρωση εργασιών, θα πρέπει να αλλάξετε τη μέθοδο NewJob () και στη συνέχεια να εφαρμόσετε τη μέθοδο ReturnJob ().

Δημιουργήστε μια τάξη JobMetadata για να αποθηκεύσετε τα μεταδεδομένα της εργασίας σας

Θα χρησιμοποιήσουμε μια προσαρμοσμένη τάξη για να αποθηκεύσουμε τα μεταδεδομένα που σχετίζονται με μια εργασία, δηλαδή το αναγνωριστικό εργασίας, το όνομα κ.λπ. Η ακόλουθη τάξη αντιπροσωπεύει την κλάση μεταδεδομένων εργασίας.

δημόσια τάξη JobMetadata

    {

δημόσια καθοδήγηση JobId {get; σειρά; }

δημόσιος τύπος JobType {get; }

δημόσια συμβολοσειρά JobName {get; }

δημόσια συμβολοσειρά CronExpression {get; }

δημόσια JobMetadata (Αναγνωριστικό οδηγού, Type jobType, string jobName,

string cronExpression)

        {

JobId = Αναγνωριστικό;

JobType = jobType;

JobName = jobName;

CronExpression = cronExpression;

        }

    }

Δημιουργήστε μια φιλοξενούμενη υπηρεσία για να ξεκινήσετε και να σταματήσετε τον προγραμματιστή Quartz.NET

Στη συνέχεια, θα πρέπει να εφαρμόσουμε μια φιλοξενούμενη υπηρεσία. Μια φιλοξενούμενη υπηρεσία είναι μια τάξη που εφαρμόζει τη διασύνδεση IHostedService και ξεκινά το χρονοδιάγραμμα Quartz. Η ακόλουθη λίστα κωδικών απεικονίζει μια προσαρμοσμένη φιλοξενούμενη κλάση υπηρεσιών.

δημόσια τάξη CustomQuartzHostedService: IHostedService

    {

ιδιωτικό αναγνωσμένο ISchedulerFactory schedulerFactory;

ιδιωτική ανάγνωση IJobFactory jobFactory;

ιδιωτική ανάγνωση JobMetadata jobMetadata;

δημόσια CustomQuartzHostedService (ISchedulerFactory

schedulerFactory,

JobMetadata jobMetadata,

IJobFactory jobFactory)

        {

this.schedulerFactory = schedulerFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

δημόσιος προγραμματιστής IScheduler {get; σειρά; }

public async Εργασία StartAsync (CancellationToken ακύρωσηToken)

        {

Scheduler = αναμονή schedulerFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigger = CreateTrigger (jobMetadata);

περιμένετε Scheduler.ScheduleJob (εργασία, σκανδάλη, ακύρωση κουπόνι);

περιμένετε Scheduler.Start (CancellationToken);

        }

public async Task StopAsync (CancellationToken ακύρωσηToken)

        {

περιμένετε το Χρονοδιάγραμμα;. Τερματισμός (ακύρωση κουπονιού);

        }

ιδιωτικό ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

επιστροφή TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

.WithDescription ($ "{jobMetadata.JobName}")

.Χτίζω();

        }

ιδιωτικό IJobDetail CreateJob (JobMetadata jobMetadata)

        {

επιστροφή JobBuilder

.Create (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ()).

.WithDescription ($ "{jobMetadata.JobName}")

.Χτίζω();

        }

    }

Το ακόλουθο απόσπασμα κώδικα εμφανίζει τον πλήρη κώδικα της μεθόδου ConfigureServices της κλάσης εκκίνησης.

public void ConfigureServices (υπηρεσίες IServiceCollection)

{

υπηρεσίες.AddControllers ();

υπηρεσίες. AddSingleton ();

υπηρεσίες. AddSingleton ();

υπηρεσίες. AddSingleton ();

services.AddSingleton (νέο JobMetadata (Guid.NewGuid (), typeof (NotificationJob), "Notification Job", "0/10 * * * *?"));

υπηρεσίες.AddHostedService ();

}

Και αυτό πρέπει να κάνετε! Όταν εκτελείτε την εφαρμογή θα παρατηρήσετε ότι η μέθοδος Execute () της κλάσης NotificationJob εκτελείται μία φορά κάθε 10 δευτερόλεπτα.

Το Quartz.NET είναι μια καλή επιλογή για την εφαρμογή προγραμματιστών στις εφαρμογές σας. Μπορείτε να εκμεταλλευτείτε τη δυνατότητα επιμονής στο Quartz.NET για να αποθηκεύσετε τις εργασίες σας σε μια βάση δεδομένων όπως SQL Server, PostgreSQL ή SQLite επίσης.