def start(self): ''' Start the IOLoop. Will allow messages to be send and received asynchronously on the pub and router ZMQStreams. ''' log.info('Starting broker') self.loop.start() log.debug('Exited broker IOLoop')
def __send_zmq_message(self, zmq_msg): frames = zmq_msg.to_frames() log.debug("SEND %s: %s" % (frames[0], frames[2])) self.pub.send_multipart(frames) # This shouldn't be necessary but, for some reason, pyzmq stops # sending messages on the PUB socket after about a second or so. # IOLoop is somehow not receiving the WRITE events correctly. # Need to revisit this at some point, but this at least ensures # that messages get sent. self.pub.flush()
def receive_message(self, msg_frames): ''' Assembles message from raw frames and dispatch it. msgs should be a list of two bytes values, the first being the ZMQ ID for the sender, and the second being the JSON message from the nodes. ''' zmq_msg = ZMQMessage.from_zmq_frames(msg_frames) if zmq_msg["type"] == "helloResponse": log.debug("RECV %s: %s" % (zmq_msg['source'], msg_frames[2])) else: log.debug("RECV %s: %s" % (self.zid_node.get( msg_frames[0], "unknown node"), msg_frames[2])) if zmq_msg["type"] == "helloResponse": node_name = zmq_msg['source'] if node_name in self.node_zid: err = "Duplicate hello from " + node_name log.debug(err) self.node_zid[node_name] = zmq_msg.identity self.zid_node[zmq_msg.identity] = node_name log.info(node_name + " connected") self.ds.nodes[node_name].set_state(Node.STATE_RUNNING) self.router.send_multipart([ zmq_msg.identity, "", json.dumps({ "type": "ack", "original": zmq_msg.fields }) ]) elif zmq_msg["type"] == "log": pass else: self.router.send_multipart([ zmq_msg.identity, "", json.dumps({ "type": "ack", "original": zmq_msg.fields }) ]) msg = zmq_msg.to_msg() if msg is not None: self.ds.process_message(msg, source=self.zid_node.get( msg_frames[0]))
def receive_message(self, msg_frames): ''' Assembles message from raw frames and dispatch it. msgs should be a list of two bytes values, the first being the ZMQ ID for the sender, and the second being the JSON message from the nodes. ''' zmq_msg = ZMQMessage.from_zmq_frames(msg_frames) if zmq_msg["type"] == "helloResponse": log.debug("RECV %s: %s" % (zmq_msg['source'], msg_frames[2])) else: log.debug("RECV %s: %s" % (self.zid_node.get(msg_frames[0], "unknown node"), msg_frames[2])) if zmq_msg["type"] == "helloResponse": node_name = zmq_msg['source'] if node_name in self.node_zid: err = "Duplicate hello from " + node_name log.debug(err) self.node_zid[node_name] = zmq_msg.identity self.zid_node[zmq_msg.identity] = node_name log.info(node_name + " connected") self.ds.nodes[node_name].set_state(Node.STATE_RUNNING) self.router.send_multipart([zmq_msg.identity, "".encode(), json.dumps({"type": "ack", "original": zmq_msg.fields}).encode()]) elif zmq_msg["type"] == "log": pass else: self.router.send_multipart([zmq_msg.identity, "".encode(), json.dumps({"type": "ack", "original": zmq_msg.fields}).encode()]) msg = zmq_msg.to_msg() if msg is not None: self.ds.process_message(msg, source = self.zid_node.get(msg_frames[0]))