1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dennis-kk-service-box

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-cpp_async_proxy_call.md 3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:55 ea35d5f

C++ прокси асинхронные вызовы

Сервисный прокси (service proxy) поддерживает асинхронные методы для взаимодействия с удаленными сервисами через RPC.

Предположим, что имеется следующий сервис:

service dynamic Login multiple=8 {
    ui64 login(string, string)
    void logout(ui64)
}

Инструменты генерации фреймворка создают следующие заголовочные файлы прокси:

// Автоматически сгенерированный код

#pragma once

#include <string>
#include <cstdint>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <memory>
#include <functional>
#include "rpc_proxy.h"
#include "example.struct.h"

namespace example_cpp;

// Два нижеследующих метода являются асинхронными RPC-вызовами обратной связи
using Login_login_callback = std::function<void(std::uint64_t, rpc::RpcError)>;
using Login_logout_callback = std::function<void(rpc::RpcError)>;

class LoginProxy : public virtual rpc::Proxy {
public:
    virtual ~LoginProxy() {}
    static std::uint64_t uuid() { return std::uint64_t(5871407834537456905); }

    .......

    // Ниже представлены прототипы асинхронных методов RPC
    // 1. Все асинхронные методы не имеют возвращаемого значения
    // 2. Возвращаемое значение будет получено через параметр обратного вызова
    virtual void login(const std::string&, const std::string&, Login_login_callback) = 0;
    virtual void logout(std::uint64_t, Login_logout_callback) = 0;
};

using LoginPrx = std::shared_ptr<LoginProxy>;

В реализации службы вызывающей стороны предположим, что зарегистрированный путь сервиса равен '/service/login'. Вызовите асинхронную версию прокси-сервера Login:``` // Получите прокси-сервер где-то здесь; его можно сохранить для последующего использования auto login_prx = getContext()->try_get_proxy("/service/login"); // Вызовите методы прокси-сервера if (login_prx) { login_prx->login("user", "pass", [&](std::uint64_t id, rpc::RpcError error) { if (error == rpc::RpcError::NOT_FOUND) { // Метод не найден } else if (error == rpc::RpcError::EXCEPTION) { // Процесс вызова удаленного сервиса завершился C++ исключением } else if (error == rpc::RpcError::TIMEOUT) { // Вызов истёк } else { // Вызов успешен, возвращаемое значение равно: id } }); }


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/dennis-kk-service-box.git
git@api.gitlife.ru:oschina-mirror/dennis-kk-service-box.git
oschina-mirror
dennis-kk-service-box
dennis-kk-service-box
v0.4.0-alpha