Quickfix/n - 没有连接超时事件或找不到主机?
Quickfix/n - No event for connection timeout or host not found?
所以我有一个项目,我需要在两个 FIX 引用主机之间创建故障转移以防出现故障。
FixApplication (IApplication) OnLogout() 很适合在套接字断开或您注销时挂钩事件。这很简单。但这仅在套接字连接成功开始时才有效。
如果您启动应用程序而主机已关闭,则实际上不会在任何地方为此调用任何方法。不在 IApplication 中,也不在套接字 IIinitiator 中。也不会在任何地方抛出错误,QuickFix 发起程序将只是默默地重试。
我现在正在使用带有回调的计时器来经常手动轮询并检查 Initiator IsLoggedOn() 是否为 false。然后触发故障转移。
但这真的很笨拙而且不优雅。
在成功建立网络连接和会话之前,是否有任何其他事件或方法可以挂钩以接收套接字网络故障通知?
谢谢!
Timer t = new Timer(5000)
t.Elapsed += CheckSocketConnected;
private void CheckSocketConnected(object source, ElapsedEventArgs e)
{
var connected = socketInitiator.IsLoggedOn;
if (!connected)
{
SwitchToAlternateProvider();
}
}
好吧,在意识到 QuickFix/N 组件的局限性后,如果主机宕机,我将永远不会收到来自该库的任何反馈。
我的解决方案是在 QuickFix/n
开始连接之前简单地使用以下代码检查套接字是否打开
bool IsPortOpen(string host, int port, TimeSpan timeout)
{
try
{
using(var client = new TcpClient())
{
var result = client.BeginConnect(host, port, null, null);
var success = result.AsyncWaitHandle.WaitOne(timeout);
if (!success)
{
return false;
}
client.EndConnect(result);
}
}
catch
{
return false;
}
return true;
}
所以我有一个项目,我需要在两个 FIX 引用主机之间创建故障转移以防出现故障。
FixApplication (IApplication) OnLogout() 很适合在套接字断开或您注销时挂钩事件。这很简单。但这仅在套接字连接成功开始时才有效。
如果您启动应用程序而主机已关闭,则实际上不会在任何地方为此调用任何方法。不在 IApplication 中,也不在套接字 IIinitiator 中。也不会在任何地方抛出错误,QuickFix 发起程序将只是默默地重试。
我现在正在使用带有回调的计时器来经常手动轮询并检查 Initiator IsLoggedOn() 是否为 false。然后触发故障转移。
但这真的很笨拙而且不优雅。
在成功建立网络连接和会话之前,是否有任何其他事件或方法可以挂钩以接收套接字网络故障通知?
谢谢!
Timer t = new Timer(5000)
t.Elapsed += CheckSocketConnected;
private void CheckSocketConnected(object source, ElapsedEventArgs e)
{
var connected = socketInitiator.IsLoggedOn;
if (!connected)
{
SwitchToAlternateProvider();
}
}
好吧,在意识到 QuickFix/N 组件的局限性后,如果主机宕机,我将永远不会收到来自该库的任何反馈。
我的解决方案是在 QuickFix/n
开始连接之前简单地使用以下代码检查套接字是否打开bool IsPortOpen(string host, int port, TimeSpan timeout)
{
try
{
using(var client = new TcpClient())
{
var result = client.BeginConnect(host, port, null, null);
var success = result.AsyncWaitHandle.WaitOne(timeout);
if (!success)
{
return false;
}
client.EndConnect(result);
}
}
catch
{
return false;
}
return true;
}