From 5f9d6b327bff382a241330160f8f76f73ffe815d Mon Sep 17 00:00:00 2001 From: "itdrui.de" Date: Tue, 17 Mar 2026 15:01:38 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20Telegram-Polling-Task=20sauber=20canceln?= =?UTF-8?q?=20+=20WhatsApp=20CancelledError=20beim=20Shutdown=20unterdr?= =?UTF-8?q?=C3=BCcken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- channels/telegram_channel.py | 16 ++++++++++++---- channels/whatsapp_channel.py | 3 +++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/channels/telegram_channel.py b/channels/telegram_channel.py index a92bbe5..d786188 100644 --- a/channels/telegram_channel.py +++ b/channels/telegram_channel.py @@ -21,6 +21,7 @@ class TelegramChannel(BaseChannel): def __init__(self) -> None: self._app: Application | None = None + self._polling_task: asyncio.Task | None = None self._inbound_callback: Callable[[dict[str, Any]], Awaitable[None]] | None = None def set_inbound_callback(self, cb: Callable[[dict[str, Any]], Awaitable[None]]) -> None: @@ -67,14 +68,21 @@ class TelegramChannel(BaseChannel): await self._app.initialize() await self._app.start() - # Long-Polling als Background-Task - asyncio.create_task(self._polling_loop(), name="telegram-polling") + # Long-Polling als Background-Task (Referenz speichern für sauberes Cancel) + self._polling_task = asyncio.create_task(self._polling_loop(), name="telegram-polling") logger.info("Telegram channel started (long-polling)") async def stop(self) -> None: + # Polling-Task sauber canceln + if self._polling_task and not self._polling_task.done(): + self._polling_task.cancel() + try: + await self._polling_task + except asyncio.CancelledError: + pass + self._polling_task = None + if self._app: - # Korrekte PTB v20+ Shutdown-Reihenfolge: - # Erst Updater stoppen, dann Application stoppen/shutdown try: if self._app.updater.running: await self._app.updater.stop() diff --git a/channels/whatsapp_channel.py b/channels/whatsapp_channel.py index 69a9881..7a829fe 100644 --- a/channels/whatsapp_channel.py +++ b/channels/whatsapp_channel.py @@ -1,5 +1,6 @@ from __future__ import annotations +import asyncio import logging from typing import Any, Callable, Awaitable @@ -98,6 +99,8 @@ class WhatsAppChannel(BaseChannel): await self._process_notification(body) if receipt_id: await self._delete_notification(receipt_id) + except asyncio.CancelledError: + raise except Exception as exc: logger.error("WhatsApp poll error: %s", exc)