grpc-rpc如何实现异步链式请求

发布于 2022-09-07 03:24:20 字数 1353 浏览 16 评论 0

业务中需要实现grpc请求的链式调用,服务流程如下所示:

client->serverA->serverB

在grpc服务端的创建CallData,代码如下所示:

class CallData {
    public:
        CallData(Save::AsyncService *service, ServerCompletionQueue *completionQueue) :
                status_(CREATE),
                service_(service),
                completionQueue_(completionQueue),
                responder_(&context_) {
            //Invoke the sereving logic right away
            Proceed();
        }

        void Proceed() {
            if (CREATE == status_) {
                status_ = PROCESS;
                service_->Request(&context_, &request_, &responder_, completionQueue_, completionQueue_, this);
            } else if (PROCESS == status_) {
                new CallData(service_, completionQueue_, sender_);
                
                //在此处新建异步请求吗?改写没有思路
                
                status_ = FINISH;
                responder_.Finish(reply_, Status::OK, this);
            } else {
                GPR_ASSERT(FINISH == status_);
                delete this;
            }
        }

    private:
        enum CallStatus {
            CREATE, PROCESS, FINISH
        };
        CallStatus status_;
        
        //省略相关变量
    };

在CallData的Proceed没有想到如何进行下一步的异步请求,以及如何处理返回的结果,求指教!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落叶缤纷 2022-09-14 03:24:20

class CallData {

public:
    CallData(Save::AsyncService *service, ServerCompletionQueue *completionQueue) :
            status_(CREATE),
            service_(service),
            completionQueue_(completionQueue),
            responder_(&context_) {
        //Invoke the sereving logic right away
        Proceed();
    }

    void Proceed() {
        if (CREATE == status_) {
            status_ = PROCESS;
            service_->Request(&context_, &request_, &responder_, completionQueue_, completionQueue_, this);
            
            **doSomeThing();**
            
            
        } else if (PROCESS == status_) {
            new CallData(service_, completionQueue_, sender_);
            
            //在此处新建异步请求吗?改写没有思路
            
            status_ = FINISH;
            responder_.Finish(reply_, Status::OK, this);
        } else {
            GPR_ASSERT(FINISH == status_);
            delete this;
        }
    }

private:
    enum CallStatus {
        CREATE, PROCESS, FINISH
    };
    CallStatus status_;
    
    //省略相关变量
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文