Просмотр исходного кода

1.增加Rpc/MethodInfo.cc,封装MethodInfo类,不再以public形式暴露
2.RpcCommunicator中不需要isStop标志,该标志应该是子类负责使用,RpcCommunicator职责是通信,不需要知道服务是否停止,如果通信出现故障会调用虚函数Stop()

tanghai 13 лет назад
Родитель
Сommit
22fc54e292

+ 1 - 0
Cpp/Platform/Rpc/CMakeLists.txt

@@ -8,6 +8,7 @@ SET(RpcSrc
 	${Header}
 	${ProtoHdrs}
 	${ProtoSrcs}
+	MethodInfo.cc
 	RpcCommunicator.cc
 	RpcController.cc
 	RequestHandler.cc

+ 35 - 0
Cpp/Platform/Rpc/MethodInfo.cc

@@ -0,0 +1,35 @@
+// Copyright: All Rights Reserved
+// Author: egametang@gmail.com (tanghai)
+
+#include "Rpc/MethodInfo.h"
+
+namespace Egametang {
+
+MethodInfo::MethodInfo(
+		ProtobufServicePtr service, const google::protobuf::MethodDescriptor* methodDescriptor):
+	service(service), methodDescriptor(methodDescriptor)
+{
+}
+
+ProtobufServicePtr MethodInfo::GetService()
+{
+	return service;
+}
+
+const google::protobuf::MethodDescriptor& MethodInfo::GetMethodDescriptor() const
+{
+	return *methodDescriptor;
+}
+
+const google::protobuf::Message& MethodInfo::GetRequestPrototype() const
+{
+	return service->GetRequestPrototype(methodDescriptor);
+}
+
+
+const google::protobuf::Message& MethodInfo::GetResponsePrototype() const
+{
+	return service->GetResponsePrototype(methodDescriptor);
+}
+
+} // Egametang

+ 7 - 9
Cpp/Platform/Rpc/MethodInfo.h

@@ -9,18 +9,16 @@ namespace Egametang {
 
 class MethodInfo
 {
-public:
+private:
 	ProtobufServicePtr service;
 	const google::protobuf::MethodDescriptor* methodDescriptor;
-	const google::protobuf::Message* requestPrototype;
-	const google::protobuf::Message* responsePrototype;
 
-	MethodInfo(ProtobufServicePtr service, const google::protobuf::MethodDescriptor* methodDescriptor):
-		service(service), methodDescriptor(methodDescriptor)
-	{
-		requestPrototype = &service->GetRequestPrototype(methodDescriptor);
-		responsePrototype = &service->GetResponsePrototype(methodDescriptor);
-	}
+public:
+	MethodInfo(ProtobufServicePtr service, const google::protobuf::MethodDescriptor* methodDescriptor);
+	ProtobufServicePtr GetService();
+	const google::protobuf::MethodDescriptor& GetMethodDescriptor() const;
+	const google::protobuf::Message& GetRequestPrototype() const;
+	const google::protobuf::Message& GetResponsePrototype() const;
 };
 
 } // namespace Egametang

+ 10 - 7
Cpp/Platform/Rpc/ResponseHandler.cc

@@ -1,4 +1,5 @@
 #include <boost/make_shared.hpp>
+#include <glog/logging.h>
 #include "Rpc/MethodInfo.h"
 #include "Rpc/ResponseHandler.h"
 #include "Rpc/RpcCommunicator.h"
@@ -6,12 +7,14 @@
 namespace Egametang {
 
 ResponseHandler::ResponseHandler(
-		MethodInfoPtr& methodInfo, std::size_t id, MessageHandler& messageHandler):
-		id(id), messageHandler(messageHandler)
+		const RpcMetaPtr meta, const StringPtr message,
+		MethodInfoPtr& methodInfo, MessageHandler& messageHandler):
+		method(methodInfo->GetMethodDescriptor()),
+		id(meta->id), messageHandler(messageHandler)
 {
-	method = methodInfo->methodDescriptor;
-	request = methodInfo->requestPrototype->New();
-	response = methodInfo->responsePrototype->New();
+	request = methodInfo->GetRequestPrototype().New();
+	response = methodInfo->GetResponsePrototype().New();
+	request->ParseFromString(*message);
 }
 
 ResponseHandler::~ResponseHandler()
@@ -20,12 +23,12 @@ ResponseHandler::~ResponseHandler()
 	delete response;
 }
 
-const google::protobuf::MethodDescriptor* ResponseHandler::Method()
+const google::protobuf::MethodDescriptor& ResponseHandler::Method() const
 {
 	return method;
 }
 
-google::protobuf::Message* ResponseHandler::Request()
+const google::protobuf::Message* ResponseHandler::Request() const
 {
 	return request;
 }

+ 5 - 4
Cpp/Platform/Rpc/ResponseHandler.h

@@ -12,20 +12,21 @@ namespace Egametang {
 class ResponseHandler
 {
 private:
-	const google::protobuf::MethodDescriptor* method;
+	const google::protobuf::MethodDescriptor& method;
 	google::protobuf::Message* request;
 	google::protobuf::Message* response;
 	std::size_t id;
 	MessageHandler messageHandler;
 
 public:
-	ResponseHandler(MethodInfoPtr& method_info, std::size_t id, MessageHandler& sendMessage);
+	ResponseHandler(const RpcMetaPtr meta, const StringPtr message,
+			MethodInfoPtr& methodInfo, MessageHandler& messageHandler);
 
 	~ResponseHandler();
 
-	const google::protobuf::MethodDescriptor* Method();
+	const google::protobuf::MethodDescriptor& Method() const;
 
-	google::protobuf::Message* Request();
+	const google::protobuf::Message* Request() const;
 
 	google::protobuf::Message* Response();
 

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

@@ -6,7 +6,7 @@
 namespace Egametang {
 
 RpcCommunicator::RpcCommunicator(boost::asio::io_service& service):
-		isStopped(false), ioService(service), socket(service)
+		ioService(service), socket(service)
 {
 }
 

+ 0 - 1
Cpp/Platform/Rpc/RpcCommunicator.h

@@ -35,7 +35,6 @@ public:
 class RpcCommunicator: public boost::noncopyable
 {
 protected:
-	bool isStopped;
 	boost::asio::io_service& ioService;
 	boost::asio::ip::tcp::socket socket;
 

+ 7 - 8
Cpp/Platform/Rpc/RpcServer.cc

@@ -57,22 +57,21 @@ void RpcServer::OnCallMethod(RpcSessionPtr session, ResponseHandlerPtr responseH
 			boost::bind(&ResponseHandler::Run, responseHandler));
 }
 
-void RpcServer::RunService(RpcSessionPtr session, RpcMetaPtr meta,
-		StringPtr message, MessageHandler messageHandler)
+void RpcServer::RunService(
+		RpcSessionPtr session, const RpcMetaPtr meta,
+		const StringPtr message, MessageHandler messageHandler)
 {
 	MethodInfoPtr methodInfo = methods[meta->method];
 
 	auto responseHandler =
-			boost::make_shared<ResponseHandler>(methodInfo, meta->id, messageHandler);
-	responseHandler->Request()->ParseFromString(*message);
+			boost::make_shared<ResponseHandler>(meta, message, methodInfo, messageHandler);
 
 	google::protobuf::Closure* done = google::protobuf::NewCallback(
-			this, &RpcServer::OnCallMethod,
-			session, responseHandler);
+			this, &RpcServer::OnCallMethod, session, responseHandler);
 
 	threadPool.schedule(
-			boost::bind(&google::protobuf::Service::CallMethod, methodInfo->service,
-					responseHandler->Method(), (google::protobuf::RpcController*)(nullptr),
+			boost::bind(&google::protobuf::Service::CallMethod, methodInfo->GetService(),
+					&responseHandler->Method(), (google::protobuf::RpcController*)(nullptr),
 					responseHandler->Request(), responseHandler->Response(),
 					done));
 }

+ 3 - 2
Cpp/Platform/Rpc/RpcServer.h

@@ -33,8 +33,9 @@ public:
 	RpcServer(boost::asio::io_service& service, int port);
 	virtual ~RpcServer();
 
-	virtual void RunService(RpcSessionPtr session, RpcMetaPtr meta,
-			StringPtr message, MessageHandler messageHandler);
+	virtual void RunService(
+			RpcSessionPtr session, const RpcMetaPtr meta,
+			const StringPtr message, MessageHandler messageHandler);
 	virtual void Register(ProtobufServicePtr service);
 	virtual void Remove(RpcSessionPtr session);
 };

+ 1 - 1
Cpp/Platform/Rpc/RpcServerMock.h

@@ -19,7 +19,7 @@ public:
 	{
 	}
 
-	MOCK_METHOD4(RunService, void(RpcSessionPtr, RpcMetaPtr, StringPtr, MessageHandler));
+	MOCK_METHOD4(RunService, void(RpcSessionPtr, const RpcMetaPtr,  const StringPtr, MessageHandler));
 	MOCK_METHOD1(Register, void(ProtobufServicePtr));
 	MOCK_METHOD1(Remove, void(RpcSessionPtr&));
 };

+ 2 - 2
Cpp/Platform/Rpc/RpcSession.cc

@@ -6,7 +6,7 @@
 namespace Egametang {
 
 RpcSession::RpcSession(boost::asio::io_service& ioService, RpcServer& server):
-		RpcCommunicator(ioService), rpcServer(server)
+		RpcCommunicator(ioService), rpcServer(server), isStopped(false)
 {
 }
 
@@ -20,7 +20,7 @@ void RpcSession::OnRecvMessage(RpcMetaPtr meta, StringPtr message)
 	rpcServer.RunService(session, meta, message,
 			boost::bind(&RpcSession::SendMeta, session, _1, _2));
 
-	// 可以循环利用
+	// RunService函数里读完就不使用了,可以循环利用
 	RecvMeta(meta, message);
 }
 

+ 1 - 0
Cpp/Platform/Rpc/RpcSession.h

@@ -15,6 +15,7 @@ class RpcSession: public RpcCommunicator, public boost::enable_shared_from_this<
 {
 private:
 	RpcServer& rpcServer;
+	bool isStopped;
 
 	virtual void OnRecvMessage(RpcMetaPtr meta, StringPtr message);
 	virtual void OnSendMessage(RpcMetaPtr meta, StringPtr message);