Close sessions for all services on shutdown
This commit is contained in:
+33
-5
@@ -193,11 +193,38 @@ async def on_startup_configured(dispatcher: Dispatcher):
|
|||||||
async def on_shutdown_configured(dispatcher: Dispatcher):
|
async def on_shutdown_configured(dispatcher: Dispatcher):
|
||||||
logging.warning("SHUTDOWN: on_shutdown_configured executing...")
|
logging.warning("SHUTDOWN: on_shutdown_configured executing...")
|
||||||
|
|
||||||
|
async def close_service(key: str) -> None:
|
||||||
|
service = dispatcher.get(key)
|
||||||
|
if not service:
|
||||||
|
return
|
||||||
|
close_coro = getattr(service, "close", None)
|
||||||
|
if callable(close_coro):
|
||||||
|
try:
|
||||||
|
await close_coro()
|
||||||
|
logging.info(f"{key} closed on shutdown.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.warning(f"Failed to close {key}: {e}")
|
||||||
|
else:
|
||||||
|
close_session = getattr(service, "close_session", None)
|
||||||
|
if callable(close_session):
|
||||||
|
try:
|
||||||
|
await close_session()
|
||||||
|
logging.info(f"{key} session closed on shutdown.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.warning(f"Failed to close session for {key}: {e}")
|
||||||
|
|
||||||
panel_service: Optional[PanelApiService] = dispatcher.get("panel_service")
|
for service_key in (
|
||||||
if panel_service and hasattr(panel_service, "close_session"):
|
"panel_service",
|
||||||
await panel_service.close_session()
|
"cryptopay_service",
|
||||||
logging.info("Panel API service session closed on shutdown.")
|
"tribute_service",
|
||||||
|
"panel_webhook_service",
|
||||||
|
"yookassa_service",
|
||||||
|
"promo_code_service",
|
||||||
|
"stars_service",
|
||||||
|
"subscription_service",
|
||||||
|
"referral_service",
|
||||||
|
):
|
||||||
|
await close_service(service_key)
|
||||||
|
|
||||||
bot: Bot = dispatcher["bot_instance"]
|
bot: Bot = dispatcher["bot_instance"]
|
||||||
if bot and bot.session:
|
if bot and bot.session:
|
||||||
@@ -314,7 +341,8 @@ async def run_bot(settings_param: Settings):
|
|||||||
dp.update.outer_middleware(ActionLoggerMiddleware(settings=settings_param))
|
dp.update.outer_middleware(ActionLoggerMiddleware(settings=settings_param))
|
||||||
|
|
||||||
dp.startup.register(on_startup_configured)
|
dp.startup.register(on_startup_configured)
|
||||||
dp.shutdown.register(lambda: on_shutdown_configured(dp))
|
# Register shutdown callback directly so Dispatcher instance is provided
|
||||||
|
dp.shutdown.register(on_shutdown_configured)
|
||||||
|
|
||||||
await register_all_routers(dp, settings_param)
|
await register_all_routers(dp, settings_param)
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,15 @@ class CryptoPayService:
|
|||||||
self.client = None
|
self.client = None
|
||||||
self.configured = False
|
self.configured = False
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
"""Close underlying AioCryptoPay session if initialized."""
|
||||||
|
if self.client:
|
||||||
|
try:
|
||||||
|
await self.client.close()
|
||||||
|
logging.info("CryptoPay client session closed.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.warning(f"Failed to close CryptoPay client: {e}")
|
||||||
|
|
||||||
async def create_invoice(
|
async def create_invoice(
|
||||||
self,
|
self,
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ class PanelApiService:
|
|||||||
self._session = None
|
self._session = None
|
||||||
logging.info("Panel API service HTTP session closed.")
|
logging.info("Panel API service HTTP session closed.")
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
"""Alias for close_session for API consistency."""
|
||||||
|
await self.close_session()
|
||||||
|
|
||||||
async def _prepare_headers(self) -> Dict[str, str]:
|
async def _prepare_headers(self) -> Dict[str, str]:
|
||||||
headers = {
|
headers = {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ class YooKassaService:
|
|||||||
f"Amount: {amount} {currency}. Metadata: {metadata}. Receipt: {receipt_data_dict}"
|
f"Amount: {amount} {currency}. Metadata: {metadata}. Receipt: {receipt_data_dict}"
|
||||||
)
|
)
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_running_loop()
|
||||||
response = await loop.run_in_executor(
|
response = await loop.run_in_executor(
|
||||||
None, lambda: YooKassaPayment.create(payment_request,
|
None, lambda: YooKassaPayment.create(payment_request,
|
||||||
idempotence_key))
|
idempotence_key))
|
||||||
@@ -196,7 +196,7 @@ class YooKassaService:
|
|||||||
f"Fetching payment info from YooKassa for ID: {payment_id_in_yookassa}"
|
f"Fetching payment info from YooKassa for ID: {payment_id_in_yookassa}"
|
||||||
)
|
)
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_running_loop()
|
||||||
payment_info_yk = await loop.run_in_executor(
|
payment_info_yk = await loop.run_in_executor(
|
||||||
None, lambda: YooKassaPayment.find_one(payment_id_in_yookassa))
|
None, lambda: YooKassaPayment.find_one(payment_id_in_yookassa))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user