Support subcription payments
This commit is contained in:
@@ -145,23 +145,58 @@ class BaseAlertService:
|
||||
|
||||
# PATTERN 3: Database Triggers
|
||||
async def start_database_listener(self):
|
||||
"""Listen for database notifications"""
|
||||
"""Listen for database notifications with connection management"""
|
||||
try:
|
||||
import asyncpg
|
||||
# Convert SQLAlchemy URL format to plain PostgreSQL for asyncpg
|
||||
database_url = self.config.DATABASE_URL
|
||||
if database_url.startswith('postgresql+asyncpg://'):
|
||||
database_url = database_url.replace('postgresql+asyncpg://', 'postgresql://')
|
||||
|
||||
conn = await asyncpg.connect(database_url)
|
||||
|
||||
# Register listeners based on service
|
||||
await self.register_db_listeners(conn)
|
||||
|
||||
logger.info("Database listeners registered", service=self.config.SERVICE_NAME)
|
||||
|
||||
|
||||
# Add connection timeout and retry logic
|
||||
max_retries = 3
|
||||
retry_count = 0
|
||||
conn = None
|
||||
|
||||
while retry_count < max_retries and not conn:
|
||||
try:
|
||||
conn = await asyncio.wait_for(
|
||||
asyncpg.connect(database_url),
|
||||
timeout=10.0
|
||||
)
|
||||
break
|
||||
except (asyncio.TimeoutError, Exception) as e:
|
||||
retry_count += 1
|
||||
if retry_count < max_retries:
|
||||
logger.warning(f"DB listener connection attempt {retry_count} failed, retrying...",
|
||||
service=self.config.SERVICE_NAME, error=str(e))
|
||||
await asyncio.sleep(2)
|
||||
else:
|
||||
raise
|
||||
|
||||
if conn:
|
||||
# Register listeners based on service
|
||||
await self.register_db_listeners(conn)
|
||||
logger.info("Database listeners registered", service=self.config.SERVICE_NAME)
|
||||
|
||||
# Keep connection alive with periodic ping
|
||||
asyncio.create_task(self._maintain_db_connection(conn))
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Failed to setup database listeners", service=self.config.SERVICE_NAME, error=str(e))
|
||||
|
||||
async def _maintain_db_connection(self, conn):
|
||||
"""Maintain database connection for listeners"""
|
||||
try:
|
||||
while not conn.is_closed():
|
||||
await asyncio.sleep(30) # Check every 30 seconds
|
||||
try:
|
||||
await conn.fetchval("SELECT 1")
|
||||
except Exception as e:
|
||||
logger.error("DB listener connection lost", service=self.config.SERVICE_NAME, error=str(e))
|
||||
break
|
||||
except Exception as e:
|
||||
logger.error("Error maintaining DB connection", service=self.config.SERVICE_NAME, error=str(e))
|
||||
|
||||
async def register_db_listeners(self, conn):
|
||||
"""Register database listeners - Override in service"""
|
||||
|
||||
Reference in New Issue
Block a user