Quickfix/N中Initiator的ToApp、ToAdmin回调未触发及请求异常
QuickFix Initiator问题排查与解决建议
问题代码
public static void Main() { SessionSettings settings = new SessionSettings("C:\\Users\\user\\Desktop\\Work\\QFLib\\config\\Config2.txt"); MyQuickFixApp myApp = new MyQuickFixApp(); IMessageStoreFactory storeFactory = new FileStoreFactory(settings); ILogFactory logFactory = new FileLogFactory(settings); var acceptor = new SocketInitiator( myApp, storeFactory, settings, logFactory); bool sendlogon = true; acceptor.Start(); while (true) { if(sendlogon) myApp.SendLogonRequest(myApp.session.SessionID); sendlogon = false; Thread.Sleep(1000); } acceptor.Stop(); }
遇到的问题
- Initiator的ToApp、ToAdmin回调未触发
- 服务器未收到请求,无响应返回
- 用TCP客户端发送生成的消息时,服务器报解析错误且无响应
- 配置文件和消息格式看似正常
排查与解决建议
1. 修正会话与消息发送逻辑
QuickFix的SocketInitiator会自动处理Logon请求发送,手动调用SendLogonRequest会干扰内部会话管理流程,导致回调不触发、会话无法正常建立:
- 移除手动发送Logon的代码块,让Initiator自动完成会话初始化
- 避免直接访问
myApp.session获取SessionID,应通过Session.LookupSession从配置中获取有效会话ID,或依赖Initiator的自动会话绑定
2. 验证Application类的回调实现
确保MyQuickFixApp正确继承QuickFix.Application,且重写的方法签名完全匹配:
public class MyQuickFixApp : QuickFix.Application { public override void ToAdmin(Message message, SessionID sessionID) { // 添加日志输出,确认回调触发 Console.WriteLine($"ToAdmin called: {message}"); base.ToAdmin(message, sessionID); } public override void ToApp(Message message, SessionID sessionID) { Console.WriteLine($"ToApp called: {message}"); base.ToApp(message, sessionID); } // 实现OnCreate、OnLogon、OnLogout等生命周期方法,监控会话状态 }
3. 排查消息解析错误
服务器解析错误通常是消息格式不兼容导致:
- 确认消息的
BeginString(如FIX.4.4)与配置文件、服务器要求完全一致 - 检查消息字段分隔符是否为
|,且字段顺序、校验和(CheckSum)计算正确 - 避免手动构造消息时遗漏必填字段,建议使用QuickFix的MessageBuilder生成合规消息
4. 配置与日志验证
- 核对配置文件中的
SocketConnectHost、SocketConnectPort、SenderCompID、TargetCompID是否与服务器配置完全匹配 - 查看QuickFix日志文件,重点关注连接失败、会话初始化错误的信息,这些日志会直接暴露问题根源
修正后的示例代码
public static void Main() { SessionSettings settings = new SessionSettings("C:\\Users\\user\\Desktop\\Work\\QFLib\\config\\Config2.txt"); MyQuickFixApp myApp = new MyQuickFixApp(); IMessageStoreFactory storeFactory = new FileStoreFactory(settings); ILogFactory logFactory = new FileLogFactory(settings); var initiator = new SocketInitiator( myApp, storeFactory, settings, logFactory); initiator.Start(); Console.WriteLine("Initiator已启动,按任意键停止..."); Console.ReadKey(); initiator.Stop(); }
内容的提问来源于stack exchange,提问作者Bogdan
相关产品推荐
相关产品推荐

