Dela via


Aktörshändelser

Med aktörshändelser kan du skicka meddelanden om bästa möjliga arbete från aktören till klienterna. Aktörshändelser är utformade för kommunikation mellan skådespelare och klient och bör inte användas för kommunikation mellan skådespelare.

Följande kodfragment visar hur du använder aktörshändelser i ditt program.

Definiera ett gränssnitt som beskriver de händelser som publicerats av aktören. Det här gränssnittet måste härledas IActorEvents från gränssnittet. Argumenten för metoderna måste vara serialiserbara för datakontraktet. Metoderna måste returnera void eftersom händelsemeddelanden är ett sätt och bästa möjliga arbete.

public interface IGameEvents : IActorEvents
{
    void GameScoreUpdated(Guid gameId, string currentScore);
}
public interface GameEvents implements ActorEvents
{
    void gameScoreUpdated(UUID gameId, String currentScore);
}

Deklarera händelserna som publicerats av aktören i aktörsgränssnittet.

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();
}

Implementera händelsehanteraren på klientsidan.

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);
    }
}

På klienten skapar du en proxy till aktören som publicerar händelsen och prenumererar på dess händelser.

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());

Vid redundansväxlingar kan aktören redundansväxla till en annan process eller nod. Aktörsproxyn hanterar de aktiva prenumerationerna och prenumererar automatiskt på dem igen. Du kan styra omprenumerationsintervallet via API:et ActorProxyEventExtensions.SubscribeAsync<TEvent> . Om du vill avbryta prenumerationen använder du API:et ActorProxyEventExtensions.UnsubscribeAsync<TEvent> .

Publicera händelserna när de inträffar på skådespelaren. Om det finns prenumeranter på händelsen skickar Actors-körningen dem meddelandet.

var ev = GetEvent<IGameEvents>();
ev.GameScoreUpdated(Id.GetGuidId(), score);
GameEvents event = getEvent<GameEvents>(GameEvents.class);
event.gameScoreUpdated(Id.getUUIDId(), score);

Nästa steg