Runner 扩展机制
介绍
Runner 机制类似于 Spring CommandLineRunner 的启动项, 会在逻辑服务器启动之后调用一次 Runner 接口实现类,让开发者可以通过实现 Runner 接口来扩展自身的系统。
Runner 机制,会在逻辑服与 Broker(游戏网关)建立连接之前及之后分别触发一次。
onStart
在逻辑服与游戏网关建立连接之前调用一次。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,开发者可以实现相关隔离并利用其动态属性来扩展特殊业务数据。