其他订阅事件

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

连接成功回调

void IPushClient::set_connected_callback(const std::function<void()> &cb)

注册连接建立回调。回调无参数、无返回值;仅表示连接已建立,不表示订阅已成功。

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 对应。code() 表示结果,msg() 提供服务端消息。返回 ID 不代表订阅成功,也不是行情数据序号。

unsigned int pending_id = 0;
push_client->set_subscribe_callback([&](const tigeropen::push::pb::Response& response) {
    if (response.id() == pending_id) {
        std::cout << response.code() << ": " << response.msg() << '\n';
    }
});
pending_id = push_client->subscribe_quote({"AAPL"});

模型形状(来自 Response.pb.h

字段/accessorProtobuf 类型说明
command()SocketCommon.Command响应命令
id()uint32与方法返回值关联的请求 ID
code()int32服务端结果码
msg()string服务端消息
body()PushData可选响应 body

回调公开这些 Protobuf 字段。可选值取决于响应,读取 body() 前请检查回调对象。


取消订阅结果

void IPushClient::set_unsubscribe_callback(
    const std::function<void(const tigeropen::push::pb::Response&)> &cb)

语义与订阅结果相同;使用 Response.id() 关联取消订阅方法返回的请求 ID。

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)

接收服务端协议错误。旧文档中的 std::string 回调类型错误;应读取 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)

接收连接被新会话替换的协议响应。旧文档中的 std::string 类型错误。

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?