def _dispatch(self, ctxt, message, executor_callback=None): """Dispatch an RPC message to the appropriate endpoint method. :param ctxt: the request context :type ctxt: dict :param message: the message payload :type message: dict """ ctxt = self.serializer.deserialize_context(ctxt) publisher_id = message.get('publisher_id') event_type = message.get('event_type') metadata = { 'message_id': message.get('message_id'), 'timestamp': message.get('timestamp') } priority = message.get('priority', '').lower() if priority not in PRIORITIES: LOG.warning('Unknown priority "%s"', priority) return payload = self.serializer.deserialize_entity(ctxt, message.get('payload')) for screen, callback in self._callbacks_by_priority.get(priority, []): if screen and not screen.match(ctxt, publisher_id, event_type, metadata, payload): continue localcontext.set_local_context(ctxt) try: if executor_callback: ret = executor_callback(callback, ctxt, publisher_id, event_type, payload, metadata) else: ret = callback(ctxt, publisher_id, event_type, payload, metadata) ret = NotificationResult.HANDLED if ret is None else ret if self.allow_requeue and ret == NotificationResult.REQUEUE: return ret finally: localcontext.clear_local_context() return NotificationResult.HANDLED
def _dispatch(self, ctxt, message, executor_callback=None): """Dispatch an RPC message to the appropriate endpoint method. :param ctxt: the request context :type ctxt: dict :param message: the message payload :type message: dict :raises: NoSuchMethod, UnsupportedVersion """ LOG.debug("_dispatch_message:%s", message) method = message.get('method') args = message.get('args', {}) namespace = message.get('namespace') version = message.get('version', '1.0') LOG.debug("message.get('method') %s", message) found_compatible = False for endpoint in self.endpoints: LOG.debug("endpoint :%s", endpoint) target = getattr(endpoint, 'target', None) if not target: target = self._default_target if not (self._is_namespace(target, namespace) and self._is_compatible(target, version)): continue if hasattr(endpoint, method): localcontext.set_local_context(ctxt) try: return self._do_dispatch(endpoint, method, ctxt, args, executor_callback) finally: localcontext.clear_local_context() found_compatible = True if found_compatible: raise NoSuchMethod(method) else: raise UnsupportedVersion(version, method=method)
def _dispatch(self, ctxt, message, executor_callback=None): """Dispatch an RPC message to the appropriate endpoint method. :param ctxt: the request context :type ctxt: dict :param message: the message payload :type message: dict :raises: NoSuchMethod, UnsupportedVersion """ method = message.get('method') args = message.get('args', {}) namespace = message.get('namespace') version = message.get('version', '1.0') found_compatible = False for endpoint in self.endpoints: target = getattr(endpoint, 'target', None) if not target: target = self._default_target if not (self._is_namespace(target, namespace) and self._is_compatible(target, version)): continue if hasattr(endpoint, method): localcontext.set_local_context(ctxt) try: return self._do_dispatch(endpoint, method, ctxt, args, executor_callback) finally: localcontext.clear_local_context() found_compatible = True if found_compatible: raise NoSuchMethod(method) else: raise UnsupportedVersion(version, method=method)