рдПрдХ рдореБрдлреНрдд рджрд┐рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ Google :: protobuf рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреЛрдб рдФрд░ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдБрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред
рдкреНрд░реЛрдЯреЛрдмреБрдлрд╝ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг
рддреЛ, рдкрд╣рд▓реЗ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ google :: protobuf рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдпрд╣ рджреЛ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реА + рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ
* .proto рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рдХ - рд╕рдВрджреЗрд╢ рд╡рд┐рд╡рд░рдг рд╕реЗ рдПрдХ C ++ рд╡рд░реНрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ: рдЬрд╛рд╡рд╛, рдкрд╛рдпрдерди, рдЖрджрд┐)
рд╕рдВрджреЗрд╢ рдХрд╛ рдПрдХ рд╡рд┐рд╡рд░рдг рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХрдХреНрд╖рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
package sample.proto; message ServerStatusAnswer { optional int32 threadCount = 1; repeated string listeners = 2; }
рдпрд╣рд╛рдВ рд╣рдо ServerStatusAnswer рд╕рдВрджреЗрд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝реАрд▓реНрдб рд╣реИрдВ:
- рдереНрд░реЗрдбрдХрд╛рдЙрдВрдЯ - рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреВрд░реНрдгрд╛рдВрдХ рдкреИрд░рд╛рдореАрдЯрд░
- рд╢реНрд░реЛрддрд╛ - рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬрд┐рд╕реЗ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдпрд╣ рд╡рд┐рд╡рд░рдг рд╕рдВрддреБрд╖реНрдЯ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рджреНрд╡рд╛рд░рд╛:
ServerStatusAnswer { threadCount = 3 listeners = { "one", "two" } }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдкреНрд░рд╛рд░реВрдк рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╣реИ, рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЖрд╕рд╛рдиреА рд╕реЗ рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдардиреАрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдпрд╛рд╕рдВрдХрд▓рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдФрд░ deserialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C ++ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ: рдХрд┐рд╕реА рдлрд╛рдЗрд▓ рдХреЛ, рдПрдХ рдзрд╛рд░рд╛ рдХреЛ, рдПрдХ рдмрдлрд░ рдХреЛ рдХреНрд░рдордмрджреНрдзрддрд╛ред
рдореИрдВ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ CMake рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рд╕рдорд░реНрдерди рд╣реИ:
cmake_minimum_required(VERSION 2.8) project(ProtobufTests) find_package(Protobuf REQUIRED) include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) #... set (ProtobufTestsProtoSources Message.proto ServerStatus.proto Echo.proto ) #... PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${ProtobufTestsProtoSources}) add_executable(ProtobufTests ${ProtobufTestsSources} ${PROTO_SRCS} ${PROTO_HDRS}) target_link_libraries(ProtobufTests #... ${PROTOBUF_LIBRARY} )
PROTOBUF_GENERATE_CPP - рдпрд╣ рдореИрдХреНрд░реЛ рдкреНрд░рддреНрдпреЗрдХ * .proto рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА cpp рдФрд░ h рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдХреНрд╡реИрдЯреНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЕрдВрдбрд░ рдирд┐рдХреНрд╕ рдХреЗ рддрд╣рдд рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдереНрд░реЗрдб рдкреИрдХреЗрдЬ рдФрд░ рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред
рдкреНрд░рдмрдВрдзрдХ рд╡рд┐рд╡рд░рдг
рдореИрдВрдиреЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рдмрдВрдзрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдпреБрдХреНрдд рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЛ рдЙрд╕рдХреЗ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░реЗрд╖рдгрдХрд░реНрддрд╛ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреБрдХреНрдд рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдпрд╛ рд╣рдЯрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреБрдХреНрдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЙрдбрд▓, * .dll, * .so рд▓реЛрдб рдХрд░рдХреЗ)ред
рдордирдорд╛рдиреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рд╕рд╛рд░ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ * .рдкреНрд░реЛрдЯреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрджреЗрд╢ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡реЗ рд╕рднреА Google рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВрдЧреЗ :: protobuf :: рд╕рдВрджреЗрд╢ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдВрджреЗрд╢ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ (рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ), рдФрд░ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рдмрдпрд╛рди рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддрд╛ рд╣реИ: "рдЕрдореВрд░реНрдд рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рдХреЗ рдЕрдореВрд░реНрдд рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред"
рд╣рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕реЗ рд╣реА рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
package sample.proto; message Message { required string id = 1; optional bytes data = 2; }
рд╣рдо рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдиреНрдп рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рдкреИрдХ рдХрд░реЗрдВрдЧреЗ:
- рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдЖрдИрдбреА рдореЗрдВ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрддрд╛ рд╣реИ
- рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╕рдВрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░рд╛ рдкреНрд░реЗрд╖рдгрдХрд░реНрддрд╛ рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреА рдЦреЛрдЬ рдХрд░реЗрдЧрд╛:
#ifndef MESSAGEDISPATCHER_H #define MESSAGEDISPATCHER_H #include <map> #include <stdexcept> #include <boost/noncopyable.hpp> #include <boost/smart_ptr/shared_ptr.hpp> #include "message.pb.h" class MessageProcessingError: public std::runtime_error { public: MessageProcessingError(const std::string & e): std::runtime_error(e) { } }; class MessageProcessorBase: private boost::noncopyable { public: virtual ~MessageProcessorBase() { } virtual std::string id() const = 0; virtual sample::proto::Message process(const sample::proto::Message & query) = 0; }; typedef boost::shared_ptr<MessageProcessorBase> MessageProcessorBasePtr; class MessageDispatcher { public: MessageDispatcher(); void addProcessor(MessageProcessorBasePtr processor); sample::proto::Message dispatch(const sample::proto::Message & query); typedef std::map<std::string, MessageProcessorBasePtr> DispatcherImplType; const DispatcherImplType & impl() const; private: DispatcherImplType mImpl; }; #endif // MESSAGEDISPATCHER_H
рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирдореВрдирд╛ :: рдкреНрд░реЛрдЯреЛ :: рд╕рдВрджреЗрд╢ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЕрдирдкреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП
рдЯрд╛рдЗрдк рдПрд░рд╛рд╕реБрд░ рдкреИрдЯрд░реНрди рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рдкреИрдЯрд░реНрди рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЗрдХрд╛рдИ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗрд╡рд▓ рдЬреНрдЮрд╛рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
template <typename ProtoQueryT, typename ProtoAnswerT> class ProtoMessageProcessor: public MessageProcessorBase { public: virtual sample::proto::Message process(const sample::proto::Message & query) { ProtoQueryT underlyingQuery; if (!underlyingQuery.ParseFromString(query.data())) { throw MessageProcessingError("Failed to parse query: " + query.ShortDebugString()); } ProtoAnswerT underlyingAnswer = doProcessing(underlyingQuery); sample::proto::Message a; a.set_id(query.id()); if (!underlyingAnswer.SerializeToString(a.mutable_data())) { throw MessageProcessingError("Failed to prepare answer: " + underlyingAnswer.ShortDebugString()); } return a; } private: virtual ProtoAnswerT doProcessing(const ProtoQueryT & query) = 0; };
рд╣рдо рдЖрднрд╛рд╕реА рдлрд╝рдВрдХреНрд╢рди
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди
doProcess рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ
рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдпрд╣ рддрдХрдиреАрдХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рддрдВрддреНрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдордп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдордп рдирд╣реАрдВред рдФрд░ рдЬрдм рд╕реЗ рдпрд╣ рд╡рд░реНрдЧ MessageProcessorBase рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдЕрдкрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред
рдЦреИрд░, рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЗрд╕ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рд╣реИрдВ:
package sample.proto; message ServerStatusQuery { } message ServerStatusAnswer { optional int32 threadCount = 1; repeated string listeners = 2; }
package sample.proto; message EchoQuery { required string msg = 1; } message EchoAnswer { required string echo = 1; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╡рд┐рд╡рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпреЗ рд╕рдВрджреЗрд╢ рд╕рд░реНрд╡рд░ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ (рд╕рд░реНрд╡рд░рд╕реНрдЯреИрдЯрд╕) рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╕ рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрд░реЛрдз (рдЗрдХреЛ) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд╕реНрд╡рдпрдВ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреБрдЪреНрдЫ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ ServerStatus рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреВрдВрдЧрд╛:
#ifndef SERVERSTATUSMESSAGEPROCESSOR_H #define SERVERSTATUSMESSAGEPROCESSOR_H #include "MessageDispatcher.h" #include "ServerStatus.pb.h" class ServerStatusMessageProcessor: public ProtoMessageProcessor<sample::proto::ServerStatusQuery, sample::proto::ServerStatusAnswer> { public: typedef sample::proto::ServerStatusQuery query_type; typedef sample::proto::ServerStatusAnswer answer_type; ServerStatusMessageProcessor(MessageDispatcher * dispatcher); virtual std::string id() const; private: MessageDispatcher * mDispatcher; virtual answer_type doProcessing(const query_type & query); }; #endif // SERVERSTATUSMESSAGEPROCESSOR_H
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреБрдж:
#include "ServerStatusMessageProcessor.h" using namespace sample::proto; ServerStatusMessageProcessor::ServerStatusMessageProcessor(MessageDispatcher * dispatcher) : mDispatcher(dispatcher) { } std::string ServerStatusMessageProcessor::id() const { return "ServerStatus"; } ServerStatusAnswer ServerStatusMessageProcessor::doProcessing(const ServerStatusQuery & query) { ServerStatusAnswer s; s.set_threadcount(10); typedef MessageDispatcher::DispatcherImplType::const_iterator md_iterator; const MessageDispatcher::DispatcherImplType & mdImpl = mDispatcher->impl(); for (md_iterator it = mdImpl.begin(); it != mdImpl.end(); ++it) { s.add_listeners(it->first); } return s; }
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
#include "MessageDispatcher.h" #include "ServerStatusMessageProcessor.h" #include "EchoMessageProcessor.h" #include <iostream> #include <boost/smart_ptr/make_shared.hpp> using namespace sample::proto; int main() { try { MessageDispatcher md; md.addProcessor(boost::make_shared<ServerStatusMessageProcessor>(&md)); md.addProcessor(boost::make_shared<EchoMessageProcessor>()); Message q; q.set_id("ServerStatus"); Message ans = md.dispatch(q); std::cout << "query: " << q.DebugString() << std::endl; std::cout << "answer: " << ans.DebugString() << std::endl; } catch (const std::exception & e) { std::cerr << e.what() << std::endl; } return 0; }
PS рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рдЬреАрд╕реАрд╕реА-4.4.5-linux
- cmake-2.8.2
- рдмрдврд╝рд╛рд╡рд╛-1.42
- Protobuf-2.3.0
рдЙрджрд╛рд╣рд░рдг
github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛