class Bridge(object): WELL_KNOWN_NAME = "busrpc.Bridge" def __init__(self, config): self.registration_lock = threading.RLock() self.services = {} self.services_by_host = {} self.logger = Logger() def register_service(self, hostname, server, service): try: try: self.registration_lock.acquire() if not self.services.has_key(service): self.services[service] = [] self.services[service].append((hostname, server)) if not self.services_by_host.has_key(hostname): self.services_by_host[hostname] = [] self.services_by_host[hostname].append((server, service)) finally: self.registration_lock.release() except Exception, e: self.logger.log_exc() return False else:
class RPCDispatcher(object): def __init__(self, config, register_with_bridge = True, server_host = None, is_bridge_server=None): self.logger = Logger() if is_bridge_server == None: self.is_bridge_server=not register_with_bridge else: self.is_bridge_server = is_bridge_server self.instances = {} self.hostname = socket.gethostname() if (server_host == None): self.server_host = config.server_host else: self.server_host = server_host self.name = config.server_name certdir = config.get_value('busrpc.crypto.certdir') pwd = config.get_value('busrpc.crypto.password') if not self.is_bridge_server: self.transport = busrpc.qpid_transport.QpidServerTransport(self.hostname + "!" + self.name, host=self.server_host) else: self.transport = busrpc.qpid_transport.QpidServerTransport(self.name, host=self.server_host) self.transport.callback = self.dispatch self.register_with_bridge = register_with_bridge self.runner_thread = None self.instance_method_cache = {} self.cert_mgr = CertManager(certdir, self.hostname) self.client_transport = self.transport.clone() if register_with_bridge: self.bridge = busrpc.rpc.lookup_service('bridge', self.client_transport, cert_mgr=self.cert_mgr) else: self.bridge = None for name in config.instances.iterkeys(): instance = config.instances[name] self.add_instance(name, _create_instance(config, instance)) def start(self): self.transport.start() while not self.transport.is_stopped: time.sleep(1) def stop(self): self.unregister_all() self.transport.stop() def register(self, namespace): if self.register_with_bridge: try: self.bridge.register_service(self.hostname, self.name, namespace) return True except Exception, e: self.logger.log_exc() return False else: