QuickFIX/J运行时更新Acceptor会话的正确实现方式咨询
Spring集成QuickFIX/J运行时动态会话配置更新问题
你在Spring环境中集成quickfixj-spring-boot-starter实现运行时动态会话管理的现有实现存在3个核心逻辑错误,是导致配置参数无法更新的根本原因:
- 通配符
DynamicAcceptorSessionProvider和手动addDynamicSession逻辑冲突:配置通配符会话提供器后,所有未静态配置的FIX.4.2连接到达时,提供器会自动按照你初始化时传入的默认serverSessionSettings创建会话,你手动添加的动态会话优先级低于自动创建逻辑,自定义配置不会被加载。 - 手动创建Session后直接调用
addDynamicSession不符合QuickFIX/J生命周期规范:该方法仅会把会话实例存入Acceptor的路由映射表,不会完成会话与监听端口的绑定、配置参数的全量加载;后续调用removeDynamicSession时也仅会移除路由表引用,不会清理Session的静态配置缓存、消息存储残留,重新添加会话时会直接复用旧缓存的配置,导致参数更新不生效。 - 会话更新流程缺少资源释放等待步骤:调用
removeDynamicSession触发登出、断连是异步操作,如果未等待资源完全释放就立刻添加新会话,会出现会话锁占用、旧实例残留的问题。
修正后的实现流程
- 初始化
ThreadedSocketAcceptor时替换默认的动态会话提供器为自定义实现,预留手动注册会话的配置入口,不要使用全通配符的默认提供器:
ThreadedSocketAcceptor threadedSocketAcceptor = new ThreadedSocketAcceptor( serverApplication, serverMessageStoreFactory, serverSessionSettings, serverLogFactory, serverMessageFactory ); // 自定义动态会话提供器,内部维护可热更新的会话配置映射表 CustomDynamicAcceptorSessionProvider dynamicSessionProvider = new CustomDynamicAcceptorSessionProvider( serverSessionSettings, serverApplication, serverMessageStoreFactory, serverLogFactory, serverMessageFactory ); threadedSocketAcceptor.setSessionProvider( new InetSocketAddress("0.0.0.0", 9878), dynamicSessionProvider ); threadedSocketAcceptor.start();
注:自定义CustomDynamicAcceptorSessionProvider直接继承官方DynamicAcceptorSessionProvider,新增配置注册、移除、存在性判断三个方法维护内部会话配置映射即可,不需要重写原有的连接处理逻辑。
- 运行时新增会话时,不要手动通过
DefaultSessionFactory创建Session实例,直接将构建好的会话配置注册到自定义提供器即可,连接到达时提供器会按照注册的配置自动创建会话:
SessionSettings sessionSettings = buildSessionSettings(sessionInfo, sessionID); dynamicSessionProvider.registerSession(sessionID, sessionSettings);
- 更新会话配置时,严格按照「清理旧会话-等待资源释放-注册新配置」的流程执行:
if (dynamicSessionProvider.hasSession(sessionID)) { // 触发登出、关闭连接、清理消息存储和日志上下文、移除路由注册 dynamicSessionProvider.unregisterSession(sessionID); // 等待300ms确保所有资源释放完成,避免锁占用 Thread.sleep(300); } // 注册新的会话配置 dynamicSessionProvider.registerSession(sessionID, newSessionSettings);
- OnLogon权限校验逻辑保持原有逻辑即可,校验不通过触发登出后,同步从动态会话提供器中移除对应未授权会话的配置,避免后续重复连接自动创建会话。
内容的提问来源于stack exchange,提问作者b-user
相关产品推荐
相关产品推荐

