QuickFIX/J -在运行时更新Acceptor会话



我正在使用QuickFIX/J与Spring esanchezros/QuickFIX - Spring -boot-starter,我试图在应用程序运行时添加一个新会话。

  1. 我创建一个Bean来初始化ThreadSocketAcceptor,然后我添加一个SessionProvider。应用程序监听FIX.4.2会话的所有连接。
ThreadedSocketAcceptor threadedSocketAcceptor = new ThreadedSocketAcceptor(serverApplication, serverMessageStoreFactory, serverSessionSettings,
serverLogFactory, serverMessageFactory);
SessionID anySession = new SessionID(BEGINSTRING_FIX42, WILDCARD, WILDCARD);
threadedSocketAcceptor.setSessionProvider(
new InetSocketAddress("0.0.0.0", 9878),
new DynamicAcceptorSessionProvider(serverSessionSettings, anySession, serverApplication, serverMessageStoreFactory,
serverLogFactory, serverMessageFactory)
);
  1. 应用程序正在运行,在运行期间,我构建会话设置并添加动态会话
DefaultSessionFactory defaultSessionFactory = new DefaultSessionFactory(serverApplication, serverMessageStoreFactory, serverLogFactory, serverMessageFactory);
SessionSettings sessionSettings = buildSessionSettings(session.get(), sessionID);
Session quickfixSession = defaultSessionFactory.create(sessionID, sessionSettings);
threadedSocketAcceptor.addDynamicSession(quickfixSession);
  1. OnLogon,我发送一个查询到我的数据库,知道会话是否存储在我自己的表中。如果不存在,我退出会话。

[4。更新会话设置:removeDynamicSession(注销并关闭),然后addDynamicSession.

这是继续下去的好方法吗?因为,我不能更新我的会话设置。

一种(非常)难看的方法是:

Logout(),disconnect()close()为旧会话。

删除动态会话并清理旧会话设置:

sessionConnector.removeDynamicSession( sessionID );
try {
Dictionary dictionary = sessionConnector.getSettings().get( sessionID );
Map<Object, Object> map = dictionary.toMap();
Set<Object> keySet = map.keySet();
for ( Object object : keySet ) {
sessionConnector.getSettings().removeSetting( sessionID, object.toString() );
}
} catch ( ConfigError e ) {
// ignore
}

然后添加新的会话设置:

acceptor.getSettings().set( sessionID, newSessionSettings );

然后添加新的会话:

Class<?> clazz = acceptor.getClass().getSuperclass().getSuperclass();
Method createSessionMethod = clazz.getDeclaredMethod( "createSession", SessionID.class );
createSessionMethod.setAccessible( true );
Session newSession = ( Session )createSessionMethod.invoke( acceptor, sessionID );
acceptor.addDynamicSession( newSession );

希望这对你有用。对我来说确实如此。;)

最新更新