Bläddra i källkod

RPC增加没有回调情况

tanghai 14 år sedan
förälder
incheckning
ba344c8c7c
2 ändrade filer med 24 tillägg och 16 borttagningar
  1. 23 15
      Cpp/Platform/Rpc/RpcClient.cc
  2. 1 1
      Cpp/Platform/Rpc/RpcServerTest.cc

+ 23 - 15
Cpp/Platform/Rpc/RpcClient.cc

@@ -37,17 +37,24 @@ void RpcClient::OnAsyncConnect(const boost::system::error_code& err)
 
 void RpcClient::OnRecvMessage(RpcMetaPtr meta, StringPtr message)
 {
-	RequestHandlerPtr requestHandler = requestHandlers[meta->id];
-	requestHandlers.erase(meta->id);
-
-	requestHandler->Response()->ParseFromString(*message);
-
-	// meta和message可以循环利用
-	RecvMeta(meta, message);
-	// 回调放在函数最.如果RecvMeta()放在回调之后,
-	// 另外线程可能让io_service stop,导致RecvMeta还未跑完
-	// 网络就终止了
-	requestHandler->Run();
+	// 没有回调
+	if (requestHandlers.find(meta->id) == requestHandlers.end())
+	{
+		// meta和message可以循环利用
+		RecvMeta(meta, message);
+	}
+	else
+	{
+		RequestHandlerPtr requestHandler = requestHandlers[meta->id];
+		requestHandlers.erase(meta->id);
+		requestHandler->Response()->ParseFromString(*message);
+		// meta和message可以循环利用
+		RecvMeta(meta, message);
+		// 回调放在函数最.如果RecvMeta()放在回调之后,
+		// 另外线程可能让io_service stop,导致RecvMeta还未跑完
+		// 网络就终止了
+		requestHandler->Run();
+	}
 }
 
 void RpcClient::OnSendMessage(RpcMetaPtr meta, StringPtr message)
@@ -61,11 +68,12 @@ void RpcClient::CallMethod(
 		google::protobuf::Message* response,
 		google::protobuf::Closure* done)
 {
-	RequestHandlerPtr request_handler(new RequestHandler(response, done));
-	requestHandlers[++id] = request_handler;
-
+	if (!done)
+	{
+		RequestHandlerPtr request_handler(new RequestHandler(response, done));
+		requestHandlers[++id] = request_handler;
+	}
 	boost::hash<std::string> stringHash;
-
 	StringPtr message(new std::string);
 	request->SerializePartialToString(message.get());
 	RpcMetaPtr meta(new RpcMeta());

+ 1 - 1
Cpp/Platform/Rpc/RpcServerTest.cc

@@ -83,7 +83,7 @@ TEST_F(RpcServerTest, ClientAndServer)
 	// server和client分别在两个不同的线程
 	threadPool.schedule(boost::bind(&IOServiceRun, &ioServer));
 	// 等待server OK
-	boost::this_thread::sleep(boost::posix_time::milliseconds(100));
+	boost::this_thread::sleep(boost::posix_time::milliseconds(10000));
 	threadPool.schedule(boost::bind(&IOServiceRun, &ioClient));
 
 	CountBarrier barrier;