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()
def stop(self): log.info('Stopping broker') self.running = False self.loop.stop() node_ids = self.node_pids.keys() for node_id in node_ids: self.stop_node(node_id)
def stop(self): log.info('Stopping broker') self.running = False self.loop.stop() node_ids = list(self.node_pids.keys()) for node_id in node_ids: self.stop_node(node_id)
def stop_node(self, node_id): ''' Sends SIGTERM to the named node. Node implementations should catch it and shutdown because killing procs is risky business. ''' log.info("Stopping node " + node_id) self.node_pids[node_id].terminate() del self.node_pids[node_id] pass
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 stop_node(self, node_id): ''' Sends SIGTERM to the named node. Node implementations should catch it and shutdown because killing procs is risky business. ''' log.info("Stopping node " + node_id) rc = self.node_pids[node_id].poll() if rc is not None: rc = self.node_pids[node_id].wait() log.warning("Node {} had already exited (rc = {})".format(node_id, rc)) else: self.node_pids[node_id].terminate() del self.node_pids[node_id]
def stop_node(self, node_id): ''' Sends SIGTERM to the named node. Node implementations should catch it and shutdown because killing procs is risky business. ''' log.info("Stopping node " + node_id) rc = self.node_pids[node_id].poll() if rc is not None: rc = self.node_pids[node_id].wait() log.warning("Node {} had already exited (rc = {})".format( node_id, rc)) else: self.node_pids[node_id].terminate() del self.node_pids[node_id]
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]))