アクター イベント
アクター イベントは、アクターからクライアントにベスト エフォート通知を送信する方法を提供します。 アクター イベントは、アクターとクライアントの通信用に設計されており、アクター間の通信には使用できません。
次のコード スニペットは、アプリケーションでアクター イベントを使用する方法を示しています。
アクターによって発行されたイベントを表すインターフェイスを定義します。 このインターフェイスは、 IActorEvents
インターフェイスから派生する必要があります。 メソッドの引数は、 データ コントラクト シリアル化可能である必要があります。 イベント通知が一方向かつベスト エフォートであるため、メソッドは void を返す必要があります。
public interface IGameEvents : IActorEvents
{
void GameScoreUpdated(Guid gameId, string currentScore);
}
public interface GameEvents implements ActorEvents
{
void gameScoreUpdated(UUID gameId, String currentScore);
}
アクター インターフェイスで、アクターによって発行されたイベントを宣言します。
public interface IGameActor : IActor, IActorEventPublisher<IGameEvents>
{
Task UpdateGameStatus(GameStatus status);
Task<string> GetGameScore();
}
public interface GameActor extends Actor, ActorEventPublisherE<GameEvents>
{
CompletableFuture<?> updateGameStatus(GameStatus status);
CompletableFuture<String> getGameScore();
}
クライアント側で、イベント ハンドラーを実装します。
class GameEventsHandler : IGameEvents
{
public void GameScoreUpdated(Guid gameId, string currentScore)
{
Console.WriteLine(@"Updates: Game: {0}, Score: {1}", gameId, currentScore);
}
}
class GameEventsHandler implements GameEvents {
public void gameScoreUpdated(UUID gameId, String currentScore)
{
System.out.println("Updates: Game: "+gameId+" ,Score: "+currentScore);
}
}
クライアント側で、イベントを発行するアクターに対してプロキシを作成し、そのイベントをサブスクライブします。
var proxy = ActorProxy.Create<IGameActor>(
new ActorId(Guid.Parse(arg)), ApplicationName);
await proxy.SubscribeAsync<IGameEvents>(new GameEventsHandler());
GameActor actorProxy = ActorProxyBase.create<GameActor>(GameActor.class, new ActorId(UUID.fromString(args)));
return ActorProxyEventUtility.subscribeAsync(actorProxy, new GameEventsHandler());
フェールオーバーが発生した場合、アクターは別のプロセスまたはノードにフェールオーバーする可能性があります。 アクター プロキシは、アクティブなサブスクリプションを管理し、自動的に再サブスクライブします。 ActorProxyEventExtensions.SubscribeAsync<TEvent>
API を介して、再サブスクリプションの間隔を制御できます。 サブスクリプションを解除するには、 ActorProxyEventExtensions.UnsubscribeAsync<TEvent>
API を使用します。
アクターで、イベントが発生したときに発行します。 イベントをサブスクライブしているユーザーがいる場合、アクター ランタイムはこれらのユーザーに通知を送信します。
var ev = GetEvent<IGameEvents>();
ev.GameScoreUpdated(Id.GetGuidId(), score);
GameEvents event = getEvent<GameEvents>(GameEvents.class);
event.gameScoreUpdated(Id.getUUIDId(), score);