Comment commencer à Quartz ASP.NET Core?
J'ai la classe suivante
public class MyEmailService
{
public async Task<bool> SendAdminEmails()
{
...
}
public async Task<bool> SendUserEmails()
{
...
}
}
public interface IMyEmailService
{
Task<bool> SendAdminEmails();
Task<bool> SendUserEmails();
}
J'ai installé la dernière Quartz 2.4.1 package Nuget parce que je voulais un léger planificateur dans mon application web sans base de données SQL Server.
J'ai besoin de planifier les méthodes
SendUserEmails
pour exécuter chaque semaine, les lundis de 17:00,le mardi de 17:00 & le mercredi de 17:00SendAdminEmails
pour exécuter chaque semaine, le jeudi 09:00, le vendredi de 9:00
Quel code dois-je planifier ces méthodes à l'aide de Quartz dans ASP.NET Core? J'ai aussi besoin de savoir comment commencer à Quartz ASP.NET de Base que tous les exemples de code sur internet, reportez-vous aux versions précédentes de ASP.NET.
Je peux trouver un exemple de code pour la version précédente de ASP.NET mais je ne sais pas comment commencer à Quartz ASP.NET de Base pour démarrer le test.
Où dois-je mettre la JobScheduler.Start();
dans ASP.NET Core?
Qu'avez-vous essayé jusqu'à présent?
Je n'ai trouvé aucun exemple de code sur internet ASP.NET de Base qui explique l'équivalent de
JobScheduler.Start();
dans mikesdotnetting.com/article/254/... La programmation, je devrais être en mesure de résoudre, mais le départ de Quartz est un mystère ASP.NET de Base. Google ne trouve rienvoir github.com/quartznet/quartznet/issues/355
Peut-être une fin de commentaire, mais je vois que vous utilisez la version 2.4.1 du package NuGet. Il ne cible pas .NET de Base, à mon humble avis. Vous devriez être à la recherche à la version 3 (quartz-scheduler.net/2016/08/16/...), il y a alpha paquets disponibles (nuget.org/packages/Quartz/3.0.0-alpha2). Aussi, le guide de migration (quartz-scheduler.net/documentation/quartz-3.x/...) et la version 3.x tutoriel (quartz-scheduler.net/documentation/quartz-3.x/tutorial/...) peut apporter quelque lumière.
OriginalL'auteur dev2go | 2017-01-24
Vous devez vous connecter pour publier un commentaire.
TL;DR (réponse complète peut être trouvée ci-dessous)
Supposé de l'outillage: Visual Studio 2017 RTM, .NET de Base 1.1, .NET SDK de Base 1.0, SQL Server Express 2016 LocalDB.
Dans l'application web .csproj:
Dans le
Program
classe (comme échafaudée par Visual Studio par défaut):Un exemple d'une classe d'emploi:
Réponse complète
De Quartz .NET de Base
Tout d'abord, vous devez utiliser la version 3 de Quartz, qu'il cible .NET de Base, selon cette annonce.
Actuellement, seules les versions alpha de v3 paquets sont disponible sur NuGet. Il ressemble à l'équipe a mis beaucoup d'efforts en libérant des sections 2.5.0, qui ne cible pas .NET de Base. Néanmoins, dans leur dépôt GitHub, le
master
branche est déjà dédié à la v3, et fondamentalement, questions ouvertes pour la version v3 ne semblent pas être critique, surtout des vieux wishlist éléments, à mon humble avis. Depuis les dernières commettre l'activité est assez faible, je m'attends v3 version dans quelques mois, ou peut-être la moitié de l'année, mais on ne sait pas.Emplois et IIS recyclage
Si l'application web va être organisé sous IIS, vous devez prendre en considération le recyclage/déchargement de comportement des processus de travail. L'ASP.NET web de Base application s'exécute en tant que régulier .NET de Base du processus, distinct de w3wp.exe - IIS ne sert de proxy inverse. Néanmoins, lorsqu'une instance de w3wp.exe est recyclé ou de déchargement, les .NET de Base app processus est également signalé à la sortie (selon cette).
Application Web peut aussi être auto-hébergé derrière un non-IIS reverse proxy (NGINX par exemple), mais je vais supposer que vous utilisez IIS, étroit et ma réponse en conséquence.
Les problèmes de recyclage/déchargement introduit sont bien expliqués dans le post référencé par @darin-dimitrov:
Pourquoi voudriez-vous d'accueil des tâches planifiées dans une application web
Je pense justification de ceux-ci ayant courriel emplois hébergé dans une application web, malgré les problèmes énumérés ci-dessus. C'est la décision d'avoir un seul type de modèle d'application (ASP.NET). Cette approche simplifie la courbe d'apprentissage, la procédure de déploiement, suivi de production, etc.
Si vous ne voulez pas introduire backend microservices (ce qui serait un bon endroit pour déplacer la messagerie emplois), alors il est logique de surmonter IIS recyclage/déchargement des comportements et de l'exécution de Quartz à l'intérieur d'une web app.
Ou peut-être vous avez d'autres raisons.
De travail persistant magasin
Dans votre scénario, l'état de l'exécution du travail doivent être conservées en dehors du processus. Donc, par défaut RAMJobStore ne rentre pas, et vous devez utiliser le ADO.NET de Travail Magasin de.
Puisque vous avez mentionné SQL Server dans la question, je vais vous donner l'exemple de configuration pour SQL Server base de données.
Comment démarrer (et arrêter) le planificateur
Je suppose que vous utilisez Visual Studio 2017 et la dernière version récente de .NET de Base de l'outillage. La mienne l'est .NET de Base d'Exécution 1.1 et .NET SDK de Base 1.0.
Pour DB exemple de configuration, je vais utiliser une base de données nommée
Quartz
dans SQL Server 2016 Express LocalDB. DB scripts d'installation peut être trouvé ici.Tout d'abord, ajouter des références de package d'application web .csproj (ou de le faire avec le gestionnaire de package NuGet GUI dans Visual Studio):
Avec l'aide de Guide De Migration et la V3 Tutoriel, nous pouvons comprendre comment démarrer et arrêter le planificateur. Je préfère pour encapsuler ce dans une catégorie distincte, soit il
QuartzStartup
.Note 1. Dans l'exemple ci-dessus,
SendUserEmailsJob
etSendAdminEmailsJob
sont des classes qui implémententIJob
. LeIJob
interface est légèrement différente deIMyEmailService
, parce qu'il renvoie voidTask
et pasTask<bool>
. Les deux catégories d'emplois devrait obtenirIMyEmailService
comme une dépendance (probablement constructeur d'injection).Note 2. Pour un travail de longue durée pour être en mesure de sortir en temps opportun, dans le
IJob.Execute
méthode, il doit observer l'état deIJobExecutionContext.CancellationToken
. Cela peut nécessiter le changement deIMyEmailService
l'interface, pour faire ses méthodes recevoirCancellationToken
paramètre:Quand et où pour démarrer et arrêter le planificateur
Dans ASP.NET de Base, l'application code de démarrage réside dans la classe
Program
, un peu comme dans l'application console. LeMain
méthode est appelée pour créer hôte web, lancer, et d'attendre jusqu'à la sortie:La chose la plus simple à faire est de simplement mettre un appel à
QuartzStartup.Start
droit dans leMain
méthode, un peu comme comme je l'ai fait dans TL;DR Mais depuis que nous avons à traiter correctement l'arrêt de processus ainsi, je préfère le crochet à la fois le démarrage et l'arrêt de code d'une manière plus cohérente.Cette ligne:
se réfère à une classe nommée
Startup
, qui est soutenue lors de la création de nouveaux ASP.NET de Base de l'Application Web projet dans Visual Studio. LeStartup
classe ressemble à ceci:Il est clair qu'un appel à
QuartzStartup.Start
doit être insérée dans une des méthodes de laStartup
classe. La question est, oùQuartzStartup.Stop
doit être accroché.Dans l'héritage .NET Framework, ASP.NET fourni
IRegisteredObject
interface. Selon ce post, et la la documentation, dans ASP.NET de Base, il a été remplacé parIApplicationLifetime
. Bingo. Une instance deIApplicationLifetime
peut être injecté dansStartup.Configure
méthode par le biais d'un paramètre.Pour des raisons de cohérence, je vais accrocher les deux
QuartzStartup.Start
etQuartzStartup.Stop
àIApplicationLifetime
:Remarque que j'ai étendu la signature de la
Configure
méthode avec un supplément deIApplicationLifetime
paramètre. Selon la documentation,ApplicationStopping
bloqué jusqu'à ce qu'rappels enregistrés sont terminés.Arrêt normal sur IIS Express, et ASP.NET module de Base
J'ai pu observer le comportement attendu des
IApplicationLifetime.ApplicationStopping
crochet uniquement sur IIS, avec la dernière ASP.NET module de Base est installé. IIS Express (installé avec Visual Studio de la Collectivité en 2017 RTM), et IIS avec une version obsolète de ASP.NET module de Base n'a pas toujours invoquerIApplicationLifetime.ApplicationStopping
. Je crois que c'est à cause de ce bug qui a été résolu.Vous pouvez installer la dernière version de ASP.NET module de Base à partir d'ici. Suivez les instructions dans le "l'Installation de la dernière ASP.NET Module de Base" section.
Quartz vs FluentScheduler
J'ai aussi pris un coup d'oeil à FluentScheduler, comme il a été proposé comme une alternative de la bibliothèque par @Brice Molesti. À ma première impression, FluentScheduler est assez simpliste et immatures solution, par rapport à Quartz. Par exemple, FluentScheduler ne fournit pas ces caractéristiques fondamentales comme l'état de travail de la persistance et de cluster d'exécution.
Fonctionne avec .net de base 2.1.
OriginalL'auteur felix-b
Je ne sais pas comment le faire avec du Quartz, mais j'avais expérimenté le même scénario avec une autre bibliothèque qui fonctionne très bien. Voici comment je l'ai dit il
Installer FluentScheduler
L'utiliser comme ceci
Documentation peut être trouvée ici FluentScheduler sur GitHub
Salut, alors pour vous répondre : (1) Dans la documentation, vous avez une partie "de l'Utiliser avec .NET de Base" (2) je suis actuellement à l'aide de mon exemple .NET de Base sans configuration supplémentaire (je n'utilise pas DI ici, mais vous pouvez) (3) - je ajouter dynamiquement des emplois de ce manager, de sorte que si j'arrête et bloque, mes tâches planifiées ne seront pas exécutées (seulement à ceux qui sont actuellement en cours d'exécution) et je ne peux pas programmer de nouvelles.
Salut @Brice, bons points. L'utilisez-vous dans ASP.NET application de Base derrière IIS proxy inverse, si? En général, les ASP.NET-de Base-derrière-IIS scénario nécessite une manipulation correcte des processus de décharger initiée par AspNetCore module IIS. C'est quand JobManager.StopAndBlock() doit être appelée. Pourtant, la documentation n'indique rien au sujet d'accrochage dans Kestrel cycle de vie du serveur.
OriginalL'auteur Hayha
En plus de @felix-b réponse. L'ajout de DI à l'emploi. Aussi QuartzStartup Commencer peut être faite async.
Basé sur cette réponse: https://stackoverflow.com/a/42158004/1235390
JobFactory classe
Démarrage de classe:
SampleJob de la classe avec le constructeur de l'injection de dépendances:
OriginalL'auteur aleha