iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
902 stars 200 forks source link

如何实现在逻辑服成功启动后,调用ActionController所在的Component里面一个初始化函数 #389

Closed fumengame closed 1 hour ago

fumengame commented 5 hours ago

我想实现一个功能,在LogicServer启动成功后 QQ图片20241102151720 调用一次ActionController所在的Component里面标注了GameInit注解的方法,类似这种功能怎么实现

我本来是想在Component里面一个方法上加上PostConstruct注解,但是这个函数启动很快,在逻辑服没启动之前就运行了

iohao commented 2 hours ago

可以先收集先收集需要处理的 class ,后续在 startupSuccess 方法中处理。收集 class 的方式有很多种,这里介绍一个 ActionParserListener 接口的方式。

参考如下 https://github.com/iohao/ioGame/blob/b69225c394ad60f7816f816503b4d4510d749ecf/common/common-core/src/main/java/com/iohao/game/action/skeleton/core/ActionParserListenerAbout.java#L66-L86

实现伪代码,收集 class

public final class GameInitParserListener implements ActionParserListener {
    public static final Set<Class<?>> set = new HashSet<>();

    @Override
    public void onActionCommand(ActionParserContext context) {
        Class<?> actionControllerClazz = context.getActionCommand().getActionControllerClazz();
        if (actionControllerClazz.getAnnotation(GameInit.class) != null) {
            set.add(actionControllerClazz);
        }
    }
}

BarSkeletonBuilder builder = ...;
builder.addActionParserListener(new GameInitParserListener());

处理

// org.springframework.context.ApplicationContext
ApplicationContext applicationContext;

public void startupSuccess(BrokerClient brokerClient) {
    var set = GameInitParserListener.set;
    for (Class<?> c : set) {
        var bean = applicationContext.getBean(c);
    }    
}

其他参考

fumengame commented 1 hour ago

感谢,问题已解决