其他订阅事件

本页记录连接事件和请求结果回调。客户端创建、连接、断开和心跳见客户端生命周期。

连接成功回调

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"});

响应字段

字段/accessorProtobuf 类型说明
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 仅用于关联当前客户端连接内的消息。行情流需要对应的行情权限,账户流需要账户访问权限。运行时订阅注册与上述访问权限相互独立,并仍受适用的标的额度和频率限制。


Did this page help you?