其他订阅事件
本页记录连接事件和请求结果回调。客户端创建、连接、断开和心跳见客户端生命周期。
连接成功回调
void IPushClient::set_connected_callback(const std::function<void()> &cb)注册连接建立回调。回调无参数、无返回值;它在 TLS 握手完成且认证帧已发送后触发,不等待服务端认证确认,也不表示订阅成功。自动重连后会再次触发,但 SDK 不恢复旧订阅。
push_client->set_connected_callback([]() { std::cout << "connected\n"; });断开回调
void IPushClient::set_disconnected_callback(const std::function<void()> &cb)注册连接断开回调。回调运行在线程内部;不要在回调中销毁正在执行回调的客户端。
push_client->set_disconnected_callback([]() { std::cout << "disconnected\n"; });传输错误
void IPushClient::set_inner_error_callback(
const std::function<void(std::string)> &cb)接收传输层字符串错误。这是唯一接收 std::string 的错误回调。
push_client->set_inner_error_callback([](std::string message) {
std::cerr << message << '\n';
});订阅结果
void IPushClient::set_subscribe_callback(
const std::function<void(const tigeropen::push::pb::Response&)> &cb)接收异步订阅完成响应。订阅方法立即返回本地请求 ID;回调中的 Response.id() 与该 ID 对应。外层 Response.code() 为 112,用于标识订阅处理完成,不表示业务成功。Response.msg() 通常是包含业务 code 和消息的 JSON,异常路径也可能返回纯文本;只有成功解析且内部 code == 0 才表示订阅成功。返回 ID 不代表订阅成功,也不是行情数据序号。
#include "cpprest/json.h"
unsigned int pending_id = 0;
push_client->set_subscribe_callback([&](const tigeropen::push::pb::Response& response) {
if (response.id() == pending_id) {
try {
const auto result = web::json::value::parse(
utility::conversions::to_string_t(response.msg()));
std::cout << "business code: " << result.at(U("code")).as_integer()
<< ", message: " << response.msg() << '\n';
} catch (const web::json::json_exception&) {
std::cerr << "subscription error: " << response.msg() << '\n';
}
}
});
pending_id = push_client->subscribe_quote({"AAPL"});响应字段
| 字段/accessor | Protobuf 类型 | 说明 |
|---|---|---|
command() | SocketCommon.Command | 响应命令 |
id() | uint32 | 与方法返回值关联的请求 ID |
code() | int32 | 协议响应类型;订阅完成为 112,退订完成为 113 |
msg() | string | 通常为 JSON 业务结果,异常路径可能为纯文本;JSON 内部 code == 0 表示成功 |
body() | PushData | 可选响应 body |
回调公开这些 Protobuf 字段。可选值取决于响应,读取 body() 前请检查回调对象。
取消订阅结果
void IPushClient::set_unsubscribe_callback(
const std::function<void(const tigeropen::push::pb::Response&)> &cb)语义与订阅结果相同;使用 Response.id() 关联取消订阅方法返回的请求 ID,并解析 Response.msg() 的内部业务 code。外层 Response.code() == 113 只表示退订处理完成。
push_client->set_unsubscribe_callback([](const tigeropen::push::pb::Response& response) {
std::cout << response.id() << " " << response.code() << '\n';
});
const unsigned int request_id = push_client->unsubscribe_quote({"AAPL"});服务端错误
void IPushClient::set_error_callback(
const std::function<void(const tigeropen::push::pb::Response&)> &cb)接收服务端协议错误。回调参数为 Response;读取 Response.id()、code() 和 msg() 获取错误信息。
push_client->set_error_callback([](const tigeropen::push::pb::Response& response) {
std::cerr << response.id() << " " << response.code() << " " << response.msg() << '\n';
});连接被替换
void IPushClient::set_kickout_callback(
const std::function<void(const tigeropen::push::pb::Response&)> &cb)接收连接被新会话替换的协议响应。回调参数为 Response。
push_client->set_kickout_callback([](const tigeropen::push::pb::Response& response) {
std::cerr << "kickout: " << response.msg() << '\n';
});查询订阅结果
void IPushClient::set_query_subscribed_symbols_changed_callback(
const std::function<void(
const tigeropen::push::pb::Response& query_subscribed_symbols_response)> &cb)配合 query_subscribed_symbols() 使用;方法返回请求 ID,回调 Response.id() 用于关联,订阅列表位于响应 body。
push_client->set_query_subscribed_symbols_changed_callback(
[](const tigeropen::push::pb::Response& response) {
std::cout << response.id() << " " << response.body().DebugString();
});
const unsigned int request_id = push_client->query_subscribed_symbols();心跳回调
void IPushClient::set_heartbeat_callback(const std::function<void()> &cb)注册收到心跳时执行的无参数回调。它用于连接健康观测,不替代断线回调。
push_client->set_heartbeat_callback([]() { std::cout << "heartbeat\n"; });权限与限制
回调异步执行,捕获对象的生命周期必须覆盖回调执行过程。请求 ID 仅用于关联当前客户端连接内的消息。行情流需要对应的行情权限,账户流需要账户访问权限。运行时订阅注册与上述访问权限相互独立,并仍受适用的标的额度和频率限制。
Updated about 1 month ago
