RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/service/zmq_message_router.h
00001 /* zmq_message_router.h                                            -*- C++ -*-
00002    Jeremy Barnes, 22 November 2012
00003    Copyright (c) 2012 Datacratic.  All rights reserved.
00004 
00005    Router object to hook up zeromq messages (identified with a topic)
00006    to callback functions.
00007 */
00008 
00009 #pragma once
00010 
00011 #include "named_endpoint.h"
00012 #include "message_loop.h"
00013 
00014 
00015 namespace Datacratic {
00016 
00017 
00018 /*****************************************************************************/
00019 /* ZMQ MESSAGE ROUTER                                                        */
00020 /*****************************************************************************/
00021 
00022 struct ZmqMessageRouter: public ZmqEventSource {
00023 
00024     ZmqMessageRouter(bool routable = true)
00025         : routable(routable)
00026     {
00027     }
00028 
00029     void addRoute(const std::string & topic,
00030                   AsyncMessageHandler handler)
00031     {
00032         messageHandlers[topic] = handler;
00033     }
00034     
00035     void bind(const std::string & topic,
00036               const std::function<void (const std::vector<std::string> & args)> & handler)
00037     {
00038         messageHandlers[topic] = handler;
00039     }
00040 
00041     virtual void handleMessage(const std::vector<std::string> & message)
00042     {
00043         std::string topic = message.at(routable);
00044 
00045         //using namespace std;
00046         //cerr << "got message " << topic << " " << message << endl;
00047 
00048         auto it = messageHandlers.find(topic);
00049         if (it == messageHandlers.end())
00050             defaultHandler(message);
00051         else it->second(message);
00052     }
00053 
00054     bool routable;
00055     std::map<std::string, AsyncMessageHandler> messageHandlers;
00056     AsyncMessageHandler defaultHandler;
00057 };
00058 
00059 
00060 } // namespace Datacratic
00061 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator