社内で使用されるASP.NET Coreアプリケーションがあり、これはオフィスアワー中に使用され、毎朝午前3時に処理されるバッチは、次のようにHangFire
によってスケジュールされます。
RecurringJob.AddOrUpdate(
() => MyBatch(),
"0 0 3 1/1 *");
問題は、サイトが手動で(通常はWebサイトにアクセスして)開始されていない場合、アプリケーションプールがスリープ状態になり、バッチが処理されないことです。
私はSOを検索し、アプリケーションプールのこれらの設定を改ざんしましたが、成功しませんでした:
設定を変更するために使用したいくつかのソース:
アプリケーションプールは、合計7つのアプリケーションによって使用されます(バッチを処理する必要がある夜間はすべて非アクティブです)。使用されるアプリケーションプールは.NET CLR Version
2.0
。 IISバージョン10.0.17134.1を使用しています。
毎朝定期的にバッチを起動できるように、アプリケーションプールをアクティブなままにするにはどうすればよいですか?
アプリプールの開始モードとして "AlwaysRunning"を使用し、サイトの "Preload Enabled"をtrueに設定し、アイドルタイムアウトを0に設定しても、ASP.NETコアアプリケーションがアイドルになる同じ問題に遭遇しました。 アプリケーション初期化モジュール をインストールし、.NET CLRバージョンをv4.0に設定することで機能します。 「マネージコードなし」を使用しないでください。常に実行すると、アプリの起動がトリガーされなくなります。
私は ブログ投稿 を書いて、アプリを継続的に実行するために実行した手順を詳しく説明しました。
私は共有しているIISほとんどの設定にアクセスできないホスティングです。私がしたことは、IISより短い分間隔でトリガーされる定期的なジョブを追加することです=タイムアウト/アイドル。
RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");
上記のCRONは、IISアプリプールがスリープ状態になるのを防ぐのに十分です。RestSharpを使用して、「Self」への小さなping/GETリクエストを作成します。
Pingと同様に、最初にHTTPアドレスへの単一の呼び出しをプロセスに入れることをお勧めします。これは、何らかの理由でサイトが実行されていない場合にサイトの起動をトリガーするのに十分です。
もう1つは、Microsoftの [〜#〜] msdn [〜#〜] の説明によると、「AlwaysRunning」オプションは次のようになります。
「Windowsプロセスアクティブ化サービス(WAS)が常にアプリケーションプールを開始することを指定します。この動作により、アプリケーションはHTTP要求を処理する前にオペレーティング環境をロードできるようになり、アプリケーションの初期HTTP要求の起動処理が削減されます。 」
それは、リクエストが来る前に行われる最初の呼び出しで行われるが実際には常にアプリケーションを実行するとは限らないWebページのコンパイルを生成することです。
上記のように、サービスの自動起動を有効にする必要があります-これに加えて、複数の例外が発生した場合、HangFireの使用時にRapid Fail Protectionがアプリケーションプールをシャットダウンしたことがわかりました。したがって、アプリケーションプールでこれを無効にする(または適切な制限に増やす)ことも価値があります。