web-dev-qa-db-ja.com

HangFire.JobStorageがインスタンス化されているかどうかを確認します

Hangfireクライアントとして動作するASP.NET MVCアプリケーションがあります-さまざまなジョブをエンキューします。 Hangfireの使用法としてSqlServerJobStorageを使用しています。

今のところ、Hangfireデータベースへの接続がなく、将来どこかで接続がインスタンス化されるシナリオに取り組んでいます。

目標は、私のASP.NET MVCアプリケーションがこの瞬間まで機能し続けることです。接続の復元後、ジョブのエンキューが開始されます。

したがって、アプリケーションはGlobal.asaxで例外をスローします。

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

さらに、すべてのジョブエンキューも例外をスローします。

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

Global.asaxの行をtry/catchブロックに入れたので、スローされません。誰かがジョブをエンキューするときに、JobStorage.Currentを確認します。初期化されていない場合は、同じコードで再度初期化を試みます。

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

誰かがこれを行う方法を知っていますか?ドキュメントにはこれに関する情報はありません。

Hangfire.GlobalConfiguration.JobStorage.IsInitializedのようなもの?

ジョブエンキューから例外をキャッチすることも1つの方法ですが、特定ではないので、私はそれが好きではありません

InvalidOperationException:JobStorage.Currentプロパティ値が初期化されていません。 Hangfire ClientまたはServer APIを使用する前に設定する必要があります。

この場所まで読んだことのある人にとても感謝しています)

9
AlexSolovyov

Hangfire.JobStorage.Current Hangfireストレージ構成をチェックする静的プロパティ自体:

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

GlobalConfiguration.Configuration.UsePostgreSqlStorage(vaildConnString);

//no exception
storage = JobStorage.Current;

さらに、データベースをクエリして接続をテストできます。

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

例外を考えると、InvalidOperationExceptionなどの代わりにSqlExceptionをスローするのが正しいと思います。特定のデータベースの詳細から分離されたハングファイアコア。

6
Ilya Chumakov