执行组件事件

执行组件事件提供了一种尽最大努力将通知从执行组件发送到客户端的方法。 执行组件事件设计用于从执行组件到客户端的通信,而不应用于从执行组件到执行组件的通信。

以下代码段演示如何在你的应用程序中使用执行组件事件。

定义说明由执行组件发布的事件的接口。 此接口必须派生自 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);

后续步骤