rad  2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
msgReplier.hpp
Go to the documentation of this file.
1 
9 #ifndef RAD_MSG_REPLIER_HPP
10 #define RAD_MSG_REPLIER_HPP
11 
12 #include <rad/assert.hpp>
13 #include <rad/logger.hpp>
14 #include <rad/msgHandler.hpp>
15 
16 #include <azmq/message.hpp>
17 #include <azmq/socket.hpp>
18 
19 #include <boost/asio.hpp>
20 
21 #include <map>
22 
23 namespace rad {
24 
28 class MsgReplier {
29  public:
30  using MsgHandler_t =
31  std::function<void(const std::string&, const std::string&, const void*, size_t)>;
32  using MsgHandlerMap_t = std::unordered_map<std::string, MsgHandler_t>;
33 
34  MsgReplier(const std::string& endpoint, boost::asio::io_service& ios,
35  std::unique_ptr<MsgHandler>&& fallback_handler);
36  virtual ~MsgReplier();
37  MsgReplier(MsgReplier&&) = default;
38 
39  void Start();
40  void Stop();
41 
42  void AddMsgHandler(const std::string& request_name, MsgHandler_t handler);
43 
44  size_t Send(const std::string& identity, const std::string& reply_type,
45  const std::string& reply_payload);
46 
47  template <typename REPLY>
48  size_t Send(const std::string& identity, const REPLY& reply_payload);
49 
50  MsgReplier(const MsgReplier&) = delete;
51  MsgReplier& operator=(const MsgReplier&) = delete;
52 
53  private:
54  std::string m_endpoint;
55  boost::asio::io_service& m_ios;
56  azmq::router_socket m_socket;
57  std::unique_ptr<MsgHandler> m_fallback_handler;
58  MsgHandlerMap_t m_handlers_map;
59 
60  void Register();
61  void Callback(boost::system::error_code const& error_code, azmq::message& msg, size_t nbytes);
62 };
63 
64 template <typename TYPEREP>
65 size_t MsgReplier::Send(const std::string& identity, const TYPEREP& reply_payload) {
67 
68  RAD_ASSERTPTR(reply_payload.GetDescriptor());
69  std::string reply_type = reply_payload.GetDescriptor()->full_name();
70 
71  std::string str;
72  if (reply_payload.SerializeToString(&str) == false) {
73  LOG4CPLUS_ERROR(GetLogger(),
74  "Failed serializing to string payload type <" << reply_type << ">");
75  return 0;
76  }
77 
78  return Send(identity, reply_type, str);
79 }
80 
81 } // namespace rad
82 
83 #endif
log4cplus::Logger & GetLogger()
Definition: logger.cpp:43
void Start()
Definition: msgReplier.cpp:74
MsgReplier(const std::string &endpoint, boost::asio::io_service &ios, std::unique_ptr< MsgHandler > &&fallback_handler)
Definition: msgReplier.cpp:26
Definition: msgReplier.hpp:28
size_t Send(const std::string &identity, const std::string &reply_type, const std::string &reply_payload)
Definition: msgReplier.cpp:57
#define RAD_ASSERTPTR(a)
Definition: assert.hpp:19
std::unordered_map< std::string, MsgHandler_t > MsgHandlerMap_t
Definition: msgReplier.hpp:32
void Stop()
Definition: msgReplier.cpp:82
MsgReplier & operator=(const MsgReplier &)=delete
virtual ~MsgReplier()
Definition: msgReplier.cpp:44
def handler
Definition: test_dispatcher.py:11
#define RAD_TRACE(logger)
Definition: logger.hpp:19
std::function< void(const std::string &, const std::string &, const void *, size_t)> MsgHandler_t
Definition: msgReplier.hpp:31
void AddMsgHandler(const std::string &request_name, MsgHandler_t handler)
Definition: msgReplier.cpp:98