def process_worker(self, sender, msg): """Process message sent to us by a worker.""" assert len(msg) >= 1 # At least, command command = msg.pop(0) worker_ready = hexlify(sender) in self.workers worker = self.require_worker(sender) if (MDP.W_READY == command): assert len(msg) >= 1 # At least, a service name service = msg.pop(0) # Not first command in session or Reserved service name if (worker_ready or service.startswith(self.INTERNAL_SERVICE_PREFIX)): self.delete_worker(worker, True) else: # Attach worker to service and mark as idle worker.service = self.require_service(service) self.worker_waiting(worker) elif (MDP.W_REPLY == command): if (worker_ready): # Remove & save client return envelope and insert the # protocol header and service name, then rewrap envelope. client = msg.pop(0) empty = msg.pop(0) # ? msg = [client, '', MDP.C_CLIENT, worker.service.name] + msg self.socket.send_multipart(msg) Metrics.inc(Metrics.BROKER_out_nb_client_reply) self.worker_waiting(worker) else: self.delete_worker(worker, True) elif (MDP.W_HEARTBEAT == command): if (worker_ready): worker.expiry = time.time() + 1e-3 * self.HEARTBEAT_EXPIRY else: self.delete_worker(worker, True) elif (MDP.W_DISCONNECT == command): self.delete_worker(worker, False) else: logging.error("E: invalid message:") dump(msg)
def send_to_worker(self, worker, command, option, msg=None): """Send message to worker. If message is provided, sends that message. """ if msg is None: msg = [] elif not isinstance(msg, list): msg = [msg] # Stack routing and protocol envelopes to start of message # and routing envelope if option is not None: msg = [option] + msg msg = [worker.address, '', MDP.W_WORKER, command] + msg if self.verbose: logging.info("I: sending %r to worker", command) dump(msg) self.socket.send_multipart(msg) Metrics.inc(Metrics.BROKER_out_nb_worker_request)
def mediate(self): """Main broker work happens here""" while True: try: if not(self._terminated): self._isup = True items = self.poller.poll(self.HEARTBEAT_INTERVAL) else: print "Quit broker sucessfully: terminated !" break except KeyboardInterrupt: print "Quit broker sucessfully: keyboard !" break # Interrupted if items: msg = self.socket.recv_multipart() if self.verbose: logging.info("I: received message:") dump(msg) sender = msg.pop(0) empty = msg.pop(0) assert empty == '' header = msg.pop(0) if (MDP.C_CLIENT == header): Metrics.inc(Metrics.BROKER_in_nb_client_request) self.process_client(sender, msg) elif (MDP.W_WORKER == header): Metrics.inc(Metrics.BROKER_in_nb_worker_reply) self.process_worker(sender, msg) else: Metrics.inc(Metrics.BROKER_in_invalid) logging.error("E: invalid message:") dump(msg) self.purge_workers() self.send_heartbeats()