9 #ifndef RAD_MSG_REQUESTOR_HPP
10 #define RAD_MSG_REQUESTOR_HPP
12 #include <rad/assert.hpp>
13 #include <rad/errors.hpp>
14 #include <rad/exceptions.hpp>
15 #include <rad/logger.hpp>
16 #include <rad/msgRequestorRaw.hpp>
18 #include <azmq/message.hpp>
19 #include <azmq/socket.hpp>
21 #include <boost/asio.hpp>
23 #include <google/protobuf/message.h>
33 template <
typename TYPEREQ,
typename TYPEREP>
36 MsgRequestor(
const std::string& endpoint,
const std::string& identity,
37 boost::asio::io_service& ios,
38 std::function<
void(
const std::error_code&, TYPEREP)> reply_handler);
41 size_t Send(
const TYPEREQ& payload,
const long timeout = 0);
47 void Callback(
const std::error_code& err_code,
const std::string& msg_type_id,
const void* data,
48 const size_t data_size);
51 std::function<void(
const std::error_code&, TYPEREP)> m_reply_handler;
62 template <
typename TYPEREQ,
typename TYPEREP>
64 const std::string& endpoint,
const std::string& identity, boost::asio::io_service& ios,
65 std::function<
void(
const std::error_code&, TYPEREP)> reply_handler)
66 : m_msg_requestor_raw(
67 endpoint, identity, ios,
69 std::placeholders::_3,
std::placeholders::_4)),
70 m_reply_handler(reply_handler) {
77 template <
typename TYPEREQ,
typename TYPEREP>
89 template <
typename TYPEREQ,
typename TYPEREP>
98 std::string payload_type = payload.GetDescriptor()->full_name();
101 if (payload.SerializeToString(&str) ==
false) {
103 "Failed serializing to string payload type <" << payload_type <<
">");
106 return m_msg_requestor_raw.Send(payload_type, str, timeout);
117 template <
typename TYPEREQ,
typename TYPEREP>
119 const std::string& msg_type_id,
const void* data,
120 const size_t data_size) {
126 m_reply_handler(err_code, reply);
130 if (reply.ParseFromArray(data, data_size)) {
131 m_reply_handler({}, reply);
133 LOG4CPLUS_ERROR(
GetLogger(),
"Failed to parse reply type <" << msg_type_id <<
">");
134 m_reply_handler(rad::ErrorCodes::DESERIALIZATION_ERR, reply);
145 template <
typename TREQ,
typename TREP>
161 boost::asio::io_service& ios)
162 : m_raw_requestor(endpoint, identity, ios) {}
181 std::chrono::milliseconds
const timeout = std::chrono::milliseconds(0)) {
184 std::string payload_type = payload.GetDescriptor()->full_name();
187 if (payload.SerializeToString(&str) ==
false) {
189 "Failed serializing to string payload type <" << payload_type <<
">");
194 [
handler](std::error_code
const& ec, std::string
const& msg_type_id,
const void* p_data,
204 if (reply.ParseFromArray(p_data, size)) {
209 handler(rad::ErrorCodes::DESERIALIZATION_ERR, reply);
221 #endif // RAD_MSG_REQUESTOR_HPP