Nous avons une application ASP.NET Core utilisée en interne qui est utilisée pendant les heures de bureau et un lot qui doit être traité à 3 heures du matin chaque matin, qui est planifié par HangFire
comme ceci:
RecurringJob.AddOrUpdate(
() => MyBatch(),
"0 0 3 1/1 *");
Le problème est que le pool d'applications se met en veille et que le lot n'est pas traité si le site n'est pas démarré manuellement (en accédant généralement au site Web).
J'ai recherché SO et altéré ces paramètres dans le pool d'applications, mais sans succès:
Quelques sources que j'ai utilisées pour modifier les paramètres:
Le pool d'applications est utilisé par un total de 7 applications (toutes étant inactives pendant la nuit lorsque le lot doit être traité). Le pool d'applications utilisé utilise .NET CLR Version
2.0
. J'utilise IIS version 10.0.17134.1.
Comment puis-je rendre le pool d'applications actif afin que le lot puisse être invoqué régulièrement tous les matins?
J'ai rencontré le même problème où mon application principale ASP.NET passe en veille même avec "AlwaysRunning" comme mode de démarrage pour le pool d'applications, "Preload Enabled" défini sur true pour le site et le délai d'inactivité défini sur 0. Je l'ai eu pour fonctionner en installant le module d'initialisation d'application et en définissant la version .NET CLR sur v4.0. N'utilisez pas le "No Managed Code" car cela empêcherait le Always Running de déclencher le démarrage de l'application.
J'ai écrit un article de blog à ce sujet expliquant plus en détail les étapes que j'ai prises pour que l'application fonctionne en continu.
Je suis sur un hébergement partagé IIS sans accès à la plupart des paramètres. Ce que j'ai fait, c'est ajouter un travail récurrent qui serait déclenché dans un intervalle de minutes inférieur à IIS = Timeout/Idle.
RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");
Le CRON ci-dessus est suffisant pour empêcher IIS App pool de se mettre en veille. J'utilise RestSharp pour faire une petite requête ping/GET à "Self".
Je vous suggère de mettre d'abord dans votre processus un seul appel à l'adresse HTTP, tout comme un ping, qui serait suffisant pour déclencher le démarrage du site s'il ne fonctionne pas pour une raison quelconque.
Une autre chose est que, selon la description de Microsoft à MSDN l'option "AlwaysRunning" serait:
"Spécifie que le service d'activation de processus Windows (WAS) démarrera toujours le pool d'applications. Ce comportement permet à une application de charger l'environnement d'exploitation avant de servir toute requête HTTP, ce qui réduit le traitement de démarrage des requêtes HTTP initiales pour l'application. "
Cela peut être de produire la compilation des pages Web qui est effectuée lors du premier appel à effectuer avant toute demande, mais peut ne pas exécuter l'application à tout moment.
Comme ci-dessus - vous devez activer le démarrage automatique du service - en plus de cela, si vous rencontrez plusieurs exceptions, j'ai constaté que la protection contre les défaillances rapides a fermé les pools d'applications dans le passé lors de l'utilisation de HangFire. Il vaut donc également la peine de désactiver (ou d'augmenter à des limites raisonnables) cela sur le pool d'applications.