web-dev-qa-db-fra.com

Vérifiez si HangFire.JobStorage est instancié

J'ai une application ASP.NET MVC qui fonctionne comme client Hangfire - elle met en file d'attente différents travaux. J'utilise SqlServerJobStorage pour utiliser Hangfire.

Pour l'instant, je travaille sur un scénario où il n'y a pas de connexion à la base de données Hangfire, et quelque part dans le futur, la connexion est instanciée.

L'objectif est que mon application ASP.NET MVC continue de fonctionner avant ce moment. Une fois la connexion rétablie, la mise en file d'attente des travaux doit commencer.

Ainsi, l'application lèvera une exception dans Global.asax:

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("EshopServiceHangfire");

De plus, toutes les files d'attente de travaux lèveront également des exceptions:

 BackgroundJob.Enqueue<ISomeClass>(x => x.DoSomethingGreat(JobCancellationToken.Null));

Je mets la ligne de Global.asax dans un bloc try/catch, donc il ne lancera pas. Quand quelqu'un met le travail en file d'attente, je veux vérifier JobStorage.Current et s'il n'est pas initialisé, j'essayerai de l'initier à nouveau avec le même code:

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("EshopServiceHangfire");

Quelqu'un sait-il comment faire cela? La documentation ne contient aucune information à ce sujet.

Quelque chose comme Hangfire.GlobalConfiguration.JobStorage.IsInitialized?

Attraper l'exception de la mise en file d'attente des jobs est également un moyen, mais je ne l'aime pas, car cela jette non spécifique

InvalidOperationException: la valeur de la propriété JobStorage.Current n'a pas été initialisée. Vous devez le définir avant d'utiliser l'API Hangfire Client ou Server.

Très apprécié pour ceux qui ont lu jusqu'à cet endroit)

9
AlexSolovyov

Vous pouvez utiliser le Hangfire.JobStorage.Current propriété statique elle-même pour vérifier la configuration du stockage Hangfire:

//InvalidOperationException " JobStorage.Current property value has not been initialized"
var storage = JobStorage.Current;

GlobalConfiguration.Configuration.UsePostgreSqlStorage(vaildConnString);

//no exception
storage = JobStorage.Current;

De plus, vous pouvez interroger une base de données pour tester la connexion:

JobStorage.Current.GetConnection().GetRecurringJobs();

Compte tenu des exceptions, je pense que lancer un InvalidOperationException au lieu de quelque chose comme SqlException est correct. Noyau Hangfire isolé des détails d'une base de données spécifique.

6
Ilya Chumakov