You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:54:53