.NET で Web または Worker ロールのライフサイクルをカスタマイズする
重要
Cloud Services (クラシック) は、2024 年 9 月 1 日をもって、すべてのお客様に対して非推奨になりました。 既存の実行中のデプロイはすべて Microsoft によって停止およびシャットダウンされ、2024 年 10 月以降、データは永久に失われます。 新しいデプロイでは、新しい Azure Resource Manager ベースのデプロイ モデル、 Azure Cloud Services (延長サポート) を使用してください。
worker ロールを作成する際に、RoleEntryPoint クラスを拡張します。このクラスは、ライフサイクル イベントに応答できるようオーバーライドするメソッドを提供します。 Web ロールの場合、このクラスは任意であり、必要に応じてライフサイクル イベントへの応答に使用する必要があります。
RoleEntryPoint クラスを拡張する
RoleEntryPoint クラスには、Web ロールやworker ロールを開始、実行、停止するときに Azure が呼び出すメソッドが含まれています。 必要に応じてこれらのメソッドをオーバーライドし、ロールの初期化、ロールのシャットダウン シーケンス、ロールの実行スレッドを管理できます。
RoleEntryPointを拡張した場合、メソッドの次のような動作に注意する必要があります。
OnStart メソッドは、ブール値を返します。したがって、このメソッドから false を返すこともできます。
コードが falseを返した場合、ロール プロセスは指定したシャットダウン シーケンスを実行せずに突然終了します。 一般的には、OnStart メソッドから false は返さないようにしてください。
RoleEntryPoint メソッドのオーバーロード内でキャッチされなかった例外は、未処理の例外として扱われます。
例外がいずれかのライフサイクル メソッドの内部で発生すると、Azure で UnhandledException イベントが発生し、プロセスが終了します。 ロールがオフラインになると、Azure によって再開されます。 ハンドルされない例外が発生した場合、Stopping イベントは発生せず、OnStop メソッドは呼び出されません。
ロールが開始しない場合や、ロールが初期化、ビジー状態、停止中の状態で再利用されている場合、ロールが再開されるたびに、ライフサイクル イベントの内部でハンドルされない例外がコードからスローされる場合があります。 この場合は、UnhandledException イベントを使用して、例外の原因を特定し適切に処理します。 ロールは、Run メソッドから戻ることもあります。その場合、ロールは再開されます。 デプロイ状態の詳細については、「ロールのリサイクルを引き起こす一般的な問題」をご覧ください。
注意
Azure Tools for Microsoft Visual Studio を使用してアプリケーションを開発している場合は、ロール プロジェクトのテンプレートによって WebRole.cs ファイルと WorkerRole.cs ファイルで RoleEntryPoint クラスが自動的に拡張されます。
OnStart メソッド
OnStart メソッドは、ロール インスタンスが Azure によってオンラインに切り替えられたときに呼び出されます。 OnStart コードの実行中、ロール インスタンスはビジーとマークされ、ロード バランサーはこのロールに外部トラフィックを送信しません。 このメソッドをオーバーライドして、イベント ハンドラーの実装や Azure Diagnostics の開始などの初期化作業を実行できます。
OnStart が true を返す場合、インスタンスは正常に初期化されており、Azure は RoleEntryPoint.Run メソッドを呼び出します。 OnStart が false を返す場合、ロールは予定されたシャットダウン シーケンスを実行せず、すぐに終了します。
OnStart メソッドをオーバーライドするコード例を次に示します。 このメソッドは、ロール インスタンスが開始されたときに診断モニターを構成して開始し、ストレージ アカウントへのログ データの転送をセットアップします。
public override bool OnStart()
{
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Error;
config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(5);
DiagnosticMonitor.Start("DiagnosticsConnectionString", config);
return true;
}
OnStop メソッド
OnStop メソッドは、Azure によってロール インスタンスがオフラインになった後、プロセスが終了する前に呼び出されます。 このメソッドをオーバーライドして、ロール インスタンスが完全にシャットダウンするのに必要なコードを呼び出すことができます。
重要
OnStop メソッドで実行されるコードは、ユーザーが開始したシャットダウン以外の理由で呼び出された場合、限られた時間内で処理を完了する必要があります。 この時間が経過するとプロセスは終了するため、 OnStop メソッドのコードが短時間で実行できるか、最後まで実行されなくても許容できることを確認する必要があります。 OnStop メソッドは、Stopping イベントが発生した後に呼び出されます。
Run メソッド
Run メソッドをオーバーライドして、ロール インスタンスの実行時間の長いスレッドを実装できます。
Run メソッドのオーバーライドは必須ではありません。既定の実装では、スリープ状態を永遠に続けるスレッドが開始されます。 Run メソッドをオーバーライドした場合、コードは無期限にブロックされます。 Run メソッドから制御が戻った場合、ロールは自動的にリサイクルされます。言い換えれば、Azure で Stopping イベントが発生し、OnStop メソッドが呼び出されて、ロールがオフラインになる前にシャットダウン シーケンスを実行できます。
Web ロール用の ASP.NET ライフサイクル メソッドの実装
Web ロールの初期化とシャットダウン シーケンスを管理するには、RoleEntryPoint クラスで提供されるメソッドのほかに、ASP.NET のライフサイクル メソッドも使用できます。 このアプローチは既存の ASP.NET アプリケーションを Azure に移植する場合に、互換性の面で役立つことがあります。 ASP.NET のライフサイクル メソッドは、 RoleEntryPoint メソッドの内部から呼び出されます。 Application_Start メソッドは、RoleEntryPoint.OnStart メソッドが終了した後に呼び出されます。 Application_End メソッドは、RoleEntryPoint.OnStop メソッドが呼び出される前に呼び出されます。
次のステップ
クラウド サービス パッケージを作成する方法について説明します。