예제 #1
0
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:
예제 #2
0
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: