QuickFixN中如何捕获“Connection refused”连接失败事件?
问题场景
我的QuickFixN应用出现FIX通信故障,日志显示:
Connecting to {IP} on port {Port} Connection failed: Connection refused {IP}:{Port}
重启应用(配置未变更)后通信恢复正常,需要捕获该“Connection refused”事件,尝试重建SocketInitiator,应用基于官方教程开发。
解决方案
1. 监听SocketInitiator的OnError事件
QuickFixN的SocketInitiator内置OnError事件,可直接捕获连接失败类错误,包括Connection refused:
代码实现
// 初始化Initiator时订阅事件 var initiator = new SocketInitiator(yourApplication, storeFactory, settings, logFactory); initiator.OnError += HandleInitiatorError; initiator.Start(); // 事件处理方法 private void HandleInitiatorError(object sender, QuickFix.ErrorEventArgs e) { if (e.Message.Contains("Connection refused")) { var socketInitiator = sender as SocketInitiator; socketInitiator.Stop(); // 延迟5秒后重试(可根据需求调整间隔) Task.Run(async () => { await Task.Delay(TimeSpan.FromSeconds(5)); try { socketInitiator.Start(); } catch (Exception ex) { // 记录重试失败日志 Console.WriteLine($"重建连接失败: {ex.Message}"); } }); } }
2. 通过Session状态变化触发重建
也可以监听Session的状态变更,当Session进入DISCONNECTED状态时,检查错误原因并重建:
代码实现
// 在IApplication的OnCreate方法中绑定Session状态事件 public void OnCreate(SessionID sessionID) { var session = Session.LookupSession(sessionID); session?.StateChanged += HandleSessionStateChange; } // 状态变化处理方法 private void HandleSessionStateChange(object sender, SessionStateChangedEventArgs e) { if (e.NewState == SessionState.DISCONNECTED) { var session = sender as Session; if (session.LastError != null && session.LastError.Message.Contains("Connection refused")) { RestartInitiator(); } } } // 重建Initiator的方法(需保证线程安全) private readonly object _lock = new object(); private SocketInitiator _initiator; // 全局保存Initiator实例 private void RestartInitiator() { lock (_lock) { _initiator.Stop(); Thread.Sleep(5000); // 延迟重试 _initiator.Start(); } }
关键注意事项
- 必须添加延迟重试机制,避免短时间内频繁请求导致目标服务器封禁。
- 重启Initiator时要保证线程安全,建议用锁或异步上下文控制并发。
- 可结合日志系统详细记录每次失败和重试过程,便于后续排查。
内容的提问来源于stack exchange,提问作者JoaoRibeiro
相关产品推荐
相关产品推荐

