Delen via


Actor-gebeurtenissen

Actorgebeurtenissen bieden een manier om best effort-meldingen van de actor naar de clients te verzenden. Actorgebeurtenissen zijn ontworpen voor communicatie tussen acteurs en clients en mogen niet worden gebruikt voor actor-naar-actorcommunicatie.

De volgende codefragmenten laten zien hoe u actorgebeurtenissen in uw toepassing kunt gebruiken.

Definieer een interface waarmee de gebeurtenissen worden beschreven die door de actor zijn gepubliceerd. Deze interface moet worden afgeleid van de IActorEvents interface. De argumenten van de methoden moeten serialiseerbare gegevenscontract zijn. De methoden moeten ongeldig worden geretourneerd, omdat gebeurtenismeldingen één manier en best effort zijn.

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

Declareer de gebeurtenissen die zijn gepubliceerd door de actor in de actorinterface.

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

Implementeer de gebeurtenis-handler aan de clientzijde.

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

Maak op de client een proxy voor de actor die de gebeurtenis publiceert en zich abonneert op de gebeurtenissen.

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

In het geval van failovers kan de actor een failover naar een ander proces of knooppunt uitvoeren. De actorproxy beheert de actieve abonnementen en abonneert deze automatisch opnieuw. U kunt het interval voor opnieuw abonnement beheren via de ActorProxyEventExtensions.SubscribeAsync<TEvent> API. Als u zich wilt afmelden, gebruikt u de ActorProxyEventExtensions.UnsubscribeAsync<TEvent> API.

Publiceer de gebeurtenissen op de actor zodra ze plaatsvinden. Als er abonnees van de gebeurtenis zijn, stuurt de Actors-runtime deze de melding.

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

Volgende stappen