一部の Orleans 動作は、順序付けされた起動とシャットダウンを必要とする十分に複雑です。 このような動作を持つコンポーネントには、グレイン、サイロ、クライアントが含まれます。 これに対処するために、 Orleans は一般的なコンポーネントライフサイクルパターンを導入しました。 このパターンは、監視可能なライフサイクルで構成され、コンポーネントの起動とシャットダウンのステージの通知を担当し、ライフサイクル オブザーバーは、特定のステージでスタートアップ操作またはシャットダウン操作を実行します。
詳細については、「 グレインライフサイクル 」および 「サイロライフサイクル」を参照してください。
監視可能なライフサイクル
順序付けされた起動とシャットダウンを必要とするコンポーネントは、監視可能なライフサイクルを使用できます。 これにより、他のコンポーネントがライフサイクルを観察し、起動時またはシャットダウン中に特定のステージに達したときに通知を受け取ることができます。
public interface ILifecycleObservable
{
IDisposable Subscribe(
string observerName,
int stage,
ILifecycleObserver observer);
}
サブスクライブ呼び出しは、起動時またはシャットダウン中にステージに到達したときに通知のためにオブザーバーを登録します。 オブザーバーの名前は、レポートの目的で使用されます。 ステージは、オブザーバーが通知を受信するスタートアップ/シャットダウン シーケンスのどの時点かを示します。 各ライフサイクル ステージは監視可能です。 起動とシャットダウン中にステージに到達すると、すべてのオブザーバーに通知されます。 ステージは昇順で開始し、降順で停止します。 オブザーバーは、返された破棄可能なオブジェクトを破棄することで購読を解除できます。
ライフサイクル オブザーバー
別のコンポーネントのライフサイクルに参加する必要があるコンポーネントは、スタートアップとシャットダウンの動作のフックを提供し、監視可能なライフサイクルの特定のステージをサブスクライブする必要があります。
public interface ILifecycleObserver
{
Task OnStart(CancellationToken ct);
Task OnStop(CancellationToken ct);
}
ILifecycleObserver.OnStartとILifecycleObserver.OnStopの両方は、スタートアップまたはシャットダウン中にサブスクライブされたステージに達したときに呼び出されます。
公共サービス
便宜上、ヘルパー関数は、一般的なライフサイクル使用パターンに対して存在します。
拡張機能
拡張機能関数は、サブスクライブコンポーネントが ILifecycleObserverを実装する必要のない監視可能なライフサイクルをサブスクライブするために使用できます。 代わりに、これによりコンポーネントがラムダやメンバー関数を渡し、指定されたステージでそれらを呼び出すことができます。
IDisposable Subscribe(
this ILifecycleObservable observable,
string observerName,
int stage,
Func<CancellationToken, Task> onStart,
Func<CancellationToken, Task> onStop);
IDisposable Subscribe(
this ILifecycleObservable observable,
string observerName,
int stage,
Func<CancellationToken, Task> onStart);
同様の拡張関数では、オブザーバー名の代わりにジェネリック型引数を使用できます。
IDisposable Subscribe<TObserver>(
this ILifecycleObservable observable,
int stage,
Func<CancellationToken, Task> onStart,
Func<CancellationToken, Task> onStop);
IDisposable Subscribe<TObserver>(
this ILifecycleObservable observable,
int stage,
Func<CancellationToken, Task> onStart);
ライフサイクルへの参加
一部の機能拡張ポイントでは、ライフサイクルへの参加に関心があるコンポーネントを認識する方法が必要です。 ライフサイクル参加要素マーカー インターフェイスがこの目的を果たします。 サイロと穀物のライフサイクルを調査する際に、その使用方法の詳細について説明します。
public interface ILifecycleParticipant<TLifecycleObservable>
where TLifecycleObservable : ILifecycleObservable
{
void Participate(TLifecycleObservable lifecycle);
}
例
Orleansライフサイクル テストから、複数のステージで監視可能なライフサイクルに参加するコンポーネントの例を次に示します。
enum TestStages
{
Down,
Initialize,
Configure,
Run,
};
class MultiStageObserver : ILifecycleParticipant<ILifecycleObservable>
{
public Dictionary<TestStages,bool> Started { get; } = new();
public Dictionary<TestStages, bool> Stopped { get; } = new();
private Task OnStartStage(TestStages stage)
{
Started[stage] = true;
return Task.CompletedTask;
}
private Task OnStopStage(TestStages stage)
{
Stopped[stage] = true;
return Task.CompletedTask;
}
public void Participate(ILifecycleObservable lifecycle)
{
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Down,
_ => OnStartStage(TestStages.Down),
_ => OnStopStage(TestStages.Down));
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Initialize,
_ => OnStartStage(TestStages.Initialize),
_ => OnStopStage(TestStages.Initialize));
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Configure,
_ => OnStartStage(TestStages.Configure),
_ => OnStopStage(TestStages.Configure));
lifecycle.Subscribe<MultiStageObserver>(
(int)TestStages.Run,
_ => OnStartStage(TestStages.Run),
_ => OnStopStage(TestStages.Run));
}
}
.NET