rad  3.0.0
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
rad::MsgReplier::Start
void Start()
Definition: msgReplier.cpp:75
rad::MsgReplier::MsgReplier
MsgReplier(const std::string &endpoint, boost::asio::io_service &ios, std::unique_ptr< MsgHandler > &&fallback_handler)
Definition: msgReplier.cpp:27
rad::MsgReplier::Send
size_t Send(const std::string &identity, const std::string &reply_type, const std::string &reply_payload)
Definition: msgReplier.cpp:58
rad::MsgReplier::AddMsgHandler
void AddMsgHandler(const std::string &request_name, MsgHandler_t handler)
Definition: msgReplier.cpp:99
rad::MsgReplier
Definition: msgReplier.hpp:28
rad::MsgReplier::Send
size_t Send(const std::string &identity, const REPLY &reply_payload)
RAD_ASSERTPTR
#define RAD_ASSERTPTR(a)
Definition: assert.hpp:19
rad::MsgReplier::MsgHandlerMap_t
std::unordered_map< std::string, MsgHandler_t > MsgHandlerMap_t
Definition: msgReplier.hpp:32
rad::MsgReplier::Stop
void Stop()
Definition: msgReplier.cpp:83
rad::MsgReplier::MsgReplier
MsgReplier(MsgReplier &&)=default
test_dispatcher.handler
def handler(event)
Definition: test_dispatcher.py:11
rad
Definition: actionCallback.hpp:21
rad::GetLogger
log4cplus::Logger & GetLogger()
Definition: logger.cpp:44
rad::MsgReplier::~MsgReplier
virtual ~MsgReplier()
Definition: msgReplier.cpp:45
rad::MsgReplier::operator=
MsgReplier & operator=(const MsgReplier &)=delete
rad::MsgReplier::MsgReplier
MsgReplier(const MsgReplier &)=delete
RAD_TRACE
#define RAD_TRACE(logger)
Definition: logger.hpp:24
rad::MsgReplier::MsgHandler_t
std::function< void(const std::string &, const std::string &, const void *, size_t)> MsgHandler_t
Definition: msgReplier.hpp:31