跳到主要内容

Runner 扩展机制

介绍

Runner 机制类似于 Spring CommandLineRunner 的启动项, 会在逻辑服务器启动之后调用一次 Runner 接口实现类,让开发者可以通过实现 Runner 接口来扩展自身的系统。

Runner 机制,会在逻辑服与 Broker(游戏网关)建立连接之前及之后分别触发一次。

  1. onStart 在逻辑服与游戏网关建立连接之前调用一次。
  2. onStartAfter 在逻辑服将信息注册到游戏网关后调用一次。

example1

现在,我们将领域事件相关的配置放到 Runner 中。


代码说明

  • code 1,实现一个 Runner 接口,将领域事件相关的配置放到该接口中管理。
  • code 19,将实现类添加到业务框架中。
public class MyDomainRunner implements Runner {
@Override
public void onStart(BarSkeleton skeleton) {
DomainEventContextParam contextParam = new DomainEventContextParam();
contextParam.addEventHandler(new UserBagEventHandler());
contextParam.addEventHandler(new UserEmailEventHandler());

DomainEventContext domainEventContext = new DomainEventContext(contextParam);
domainEventContext.startup();
}
}

public class DemoLogicServer extends AbstractBrokerClientStartup {
...
@Override
public BarSkeleton createBarSkeleton() {
...
BarSkeletonBuilder builder = config.createBuilder();
builder.addRunner(new MyDomainRunner());

return builder.build();
}
}

public record UserLoginEo(long id) implements Eo {
}

public class UserBagEventHandler implements DomainEventHandler<UserLoginEo> {
@Override
public void onEvent(UserLoginEo event, boolean endOfBatch) {
log.info("UserBag : {}", event);
}
}

public class UserEmailEventHandler implements DomainEventHandler<UserLoginEo> {
@Override
public void onEvent(UserLoginEo event, boolean endOfBatch) {
log.info("UserEmail : {}", event);
}
}

example2

将一些配置集中放到 Runner 接口中管理,可以避免配置分散。

public class MyExternalAccessAuthenticationRunner implements Runner {
@Override
public void onStart(BarSkeleton skeleton) {
var accessAuthenticationHook = ExternalGlobalConfig.accessAuthenticationHook;
accessAuthenticationHook.setVerifyIdentity(true);
accessAuthenticationHook.addIgnoreAuthenticationCmd(1, 1);
accessAuthenticationHook.addIgnoreAuthenticationCmd(2);

accessAuthenticationHook.addRejectionCmd(10);
accessAuthenticationHook.addRejectionCmd(11, 1);
}
}

public class MyExternalServer extends ExternalBrokerClientStartup {
@Override
public BarSkeleton createBarSkeleton() {
BarSkeletonBuilder builder = ...
builder.addRunner(new MyExternalAccessAuthenticationRunner());

return builder.build();
}
}

小结

Runner 机制不仅可以让我们将已有模块的功能以 Runner 形式进行扩展, 也可以通过 Runner 机制来提供配置相关的功能,避免配置过于零散。

事实上,Runner 机制的可扩展性远远不止于此。 通过 onStart 方法中的业务框架对象 BarSkeleton,开发者可以实现相关隔离并利用其动态属性来扩展特殊业务数据。