[关闭]
@zhengyuhong 2017-01-24T12:11:22.000000Z 字数 2436 阅读 2128

baidu-rpc

code


public/baidu-rpc/example/asynchronous_echo_c++/server.cpp

  1. virtual void Echo(google::protobuf::RpcController* cntl_base,
  2. const example::EchoRequest* request,
  3. example::EchoResponse* response,
  4. google::protobuf::Closure* done) {
  5. // This object helps you to call done->Run() in RAII style. If you need
  6. // to process the request asynchronously, pass done_guard.release().
  7. baidu::rpc::ClosureGuard done_guard(done);
  8. //done表示Echo执行完成后,框架需要执行的后续操作,如果实现异步调用的话,直接返回一个response给client,然后异步执行自定义代码,自定义代码函数执行完之后,再执行done->Run();告诉框架执行后续操作。

public/baidu-rpc/example/asynchronous_echo_c++/client.cpp

  1. // Since we are sending asynchronous RPC (`done' is not NULL),
  2. // these objects MUST remain valid until `done' is called.
  3. // As a result, we allocate these objects on heap
  4. example::EchoResponse* response = new example::EchoResponse();
  5. baidu::rpc::Controller* cntl = new baidu::rpc::Controller();
  6. // Notice that you don't have to new request, which can be modified
  7. // or destroyed just after stub.Echo is called.
  8. example::EchoRequest request;
  9. request.set_message("hello world");
  10. cntl->set_log_id(log_id ++); // set by user
  11. if (FLAGS_send_attachment) {
  12. // Set attachment which is wired to network directly instead of
  13. // being serialized into protobuf messages.
  14. cntl->request_attachment().append("foo");
  15. }
  16. // We use protobuf utility `NewCallback' to create a closure object
  17. // that will call our callback `HandleEchoResponse'. This closure
  18. // will automatically delete itself after being called once
  19. google::protobuf::Closure* done = baidu::rpc::NewCallback(
  20. &HandleEchoResponse, cntl, response);
  21. stub.Echo(cntl, &request, response, done);
  22. // This is an asynchronous RPC, so we can only fetch the result
  23. // inside the callback

done是回调闭包,必须创建在堆上,response是回调函数的返回参数,也必须创建在堆上,如果在栈上分配的话,在触发回调函数时,内存已经失效了。

public/baidu-rpc/example/http_c++/http_server.cpp

  1. void Echo(google::protobuf::RpcController* cntl_base,
  2. const HttpRequest*,
  3. HttpResponse*,
  4. google::protobuf::Closure* done) {
  5. // This object helps you to call done->Run() in RAII style. If you need
  6. // to process the request asynchronously, pass done_guard.release().
  7. baidu::rpc::ClosureGuard done_guard(done);
  8. baidu::rpc::Controller* cntl =
  9. static_cast<baidu::rpc::Controller*>(cntl_base);
  10. // Fill response.
  11. cntl->http_response().set_content_type("text/plain");
  12. base::IOBufBuilder os;
  13. os << "queries:";
  14. for (baidu::rpc::URI::QueryIterator it = cntl->http_request().uri().QueryBegin();
  15. it != cntl->http_request().uri().QueryEnd(); ++it) {
  16. os << ' ' << it->first << '=' << it->second;
  17. }
  18. os << "\nbody: " << cntl->request_attachment() << '\n';
  19. os.move_to(cntl->response_attachment());
  20. }

注意在http服务端中Echo函数参数const HttpRequest*, HttpResponse*,,HttpRequest,Response是没有成员变量。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注