跳至主要內容

XTP行情Quote-API断线后应对措施

xtp_master大约 4 分钟

XTP行情Quote-API断线后应对措施


在程序运行过程中,不可避免出现与行情服务器断连的情况,下面就断连时出现的回调通知,以及应对措施加以说明(适用于以上版本api)。 如果使用的是2.2.33.5以下版本的api(不包含2.2.33.5版本),无论行情服务器是TCP还是UDP的,都请参考以下文中的 进行断线重连。

一.与行情服务器断连现象

当API与行情服务器出现断线时,回调函数将会被触发。

二.与TCP行情服务器断连应对措施

当用户与行情服务器之间采用的是TCP连接时,为了后续收到行情数据,需要重写回调函数。 回调函数中的总体思路是循环调用,直至重连成功后,重新订阅快照行情。 示例代码如下:

void MyQuoteSpi::OnDisconnected(int reason)
{
	//行情服务器断线后,此函数会被调用
	//TODO:重新login,并在login成功后,再次订阅

	cout << "Disconnect from quote server. " << endl;

	//重新登陆行情服务器
	int ret = -1;
	while (0 != ret)
	{
		ret = m_pQuoteApi->Login(quote_server_ip.c_str(), quote_server_port, quote_username.c_str(), quote_password.c_str(), protocol_type);
		if (0 != ret)
		{
			// 登录失败,获取错误信息
			XTPRI* error_info = m_pQuoteApi->GetApiLastError();
			cout << "login to server error, " << error_info->error_id << " : " << error_info->error_msg << endl;

			//等待10s以后再次连接,可修改此等待时间,建议不要小于3s
#ifdef _WIN32
			Sleep(10000);
#else
			sleep(10);
#endif // _WIN32	
		}
	}

	//重连成功
	cout << "login to server success. " << endl;
	//再次订阅行情快照
	subscribeMarketData();

}

三.与UDP行情服务器断连应对措施

对于UDP行情服务器来说,行情是通过UDP组播来接收的,回调函数被触发时,其实只是表明TCP连接的断连,不会影响UDP组播接收行情数据。因此需要用户根据实际情况来决定是否需要建立TCP的重连。

1.后续不再有查询需求

如果用户在断连后没有查询行情静态数据的需求,此时可以不用重连。

2.后续有查询需求

如果用户在断连后有查询行情静态数据的需求,可以参考TCP断线重连方式进行重连,无需在登陆后重新 订阅。 示例代码如下:

void MyQuoteSpi::OnDisconnected(int reason)
{
	//行情服务器断线后,此函数会被调用
	//TODO:重新login,并在login成功后,再次订阅

	cout << "Disconnect from quote server. " << endl;

	//重新登陆行情服务器
	int ret = -1;
	while (0 != ret)
	{
		ret = m_pQuoteApi->Login(quote_server_ip.c_str(), quote_server_port, quote_username.c_str(), quote_password.c_str(), protocol_type);
		if (0 != ret)
		{
			// 登录失败,获取错误信息
			XTPRI* error_info = m_pQuoteApi->GetApiLastError();
			cout << "login to server error, " << error_info->error_id << " : " << error_info->error_msg << endl;

			//等待10s以后再次连接,可修改此等待时间,建议不要小于3s
#ifdef _WIN32
			Sleep(10000);
#else
			sleep(10);
#endif // _WIN32	
		}
	}

	//重连成功
	cout << "login to server success. " << endl;

}

3.回补行情数据

通常发生断线的时候,可能是网路状态不好导致,此时可能会有行情丢包发生。 如果发现有行情丢包情形发生,可以通过调用请求回补行情接口,将丢失的数据回补回去。 注意:回补功能与行情服务器是否断连没有任何关联,可以单独使用,即使不登陆行情服务器,也是可以使用回补行情数据功能的。 具体回补行情的用法可以参阅文档。