Skip to main content

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,开发者可以实现相关隔离并利用其动态属性来扩展特殊业务数据。