async def publish_retained_messages_for_subscription( self, subscription, session): # if self.logger.isEnabledFor(logging.DEBUG): # self.logger.debug("Begin broadcasting messages retained due to subscription on '%s' from %s", # subscription[0], format_client_message(session=session)) sub = subscription[0].split("/") handler = self._get_handler(session) async with anyio.create_task_group() as tg: for d_topic in self._retained_messages: topic = d_topic.split("/") self.logger.debug("matching : %s %s", d_topic, subscription[0]) if match_topic(topic, sub): self.logger.debug("%s and %s match", d_topic, subscription[0]) retained = self._retained_messages[d_topic] await tg.spawn( handler.mqtt_publish, retained.topic, retained.data, subscription[1], True, ) if self.logger.isEnabledFor(logging.DEBUG): self.logger.debug( "End broadcasting messages retained due to subscription on '%s' from %s", subscription[0], format_client_message(session=session), )
async def _broadcast_loop(self): async with anyio.create_task_group() as tg: while True: broadcast = await self._broadcast_queue_r.receive() # self.logger.debug("broadcasting %r", broadcast) topic = broadcast["topic"] if isinstance(topic, str): topic = topic.split("/") targets = {} for k_filter, subscriptions in self._subscriptions.items(): if match_topic(topic, k_filter): for (target_session, qos) in subscriptions: qos = max( qos, broadcast.get("qos", QOS_0), targets.get(target_session, QOS_0), ) targets[target_session] = qos for target_session, qos in targets.items(): if target_session.transitions.state == "connected": if False and self.logger.isEnabledFor(logging.DEBUG): self.logger.debug( "broadcasting application message from %s on topic '%s' to %s", format_client_message( session=broadcast["session"]), broadcast["topic"], format_client_message(session=target_session), ) handler = self._get_handler(target_session) await tg.spawn( partial( handler.mqtt_publish, broadcast["topic"], broadcast["data"], qos, retain=False, )) else: if self.logger.isEnabledFor(logging.DEBUG): self.logger.debug( "retaining application message from %s on topic '%s' to client '%s'", format_client_message( session=broadcast["session"]), broadcast["topic"], format_client_message(session=target_session), ) retained_message = RetainedApplicationMessage( broadcast["session"], broadcast["topic"], broadcast["data"], qos, ) await target_session.retained_messages.put( retained_message)
async def _dispatch(self, msg): t = msg.topic.split("/") for clients in list(self._subscriptions.values()): if not match_topic(t, clients.topic): continue for c in list(clients): if c._q is None: continue if c._q.qsize() < QSIZE - 1: await c._q.put(msg) else: await c._q.put(None) c._q = None
async def _dispatch(self, msg): t = msg.topic.split('/') for topic, clients in list(self._subscriptions.items()): if not match_topic(t, clients.__topic): continue for c in list(clients): if c._q is None: continue try: async with anyio.fail_after(0.01): await c._q.put(msg) except TimeoutError: c._q = None
async def _broadcast_loop(self): async with anyio.create_task_group() as tg: while True: broadcast = await self._broadcast_queue.get() self.logger.debug("broadcasting %r", broadcast) topic = broadcast['topic'].split('/') targets = {} for k_filter, subscriptions in self._subscriptions.items(): if match_topic(topic, k_filter): for (target_session, qos) in subscriptions: qos = max(qos, broadcast.get('qos', QOS_0), targets.get(target_session, QOS_0)) targets[target_session] = qos for target_session, qos in targets.items(): if target_session.transitions.state == 'connected': if self.logger.isEnabledFor(logging.DEBUG): self.logger.debug( "broadcasting application message from %s on topic '%s' to %s", format_client_message( session=broadcast['session']), broadcast['topic'], format_client_message(session=target_session)) handler = self._get_handler(target_session) await tg.spawn( partial(handler.mqtt_publish, broadcast['topic'], broadcast['data'], qos, retain=False)) else: if self.logger.isEnabledFor(logging.DEBUG): self.logger.debug( "retaining application message from %s on topic '%s' to client '%s'", format_client_message( session=broadcast['session']), broadcast['topic'], format_client_message(session=target_session)) retained_message = RetainedApplicationMessage( broadcast['session'], broadcast['topic'], broadcast['data'], qos) await target_session.retained_messages.put( retained_message)