""" RQ Worker Entry Point """ import sys import os from pathlib import Path from loguru import logger from redis import Redis from rq import Worker, Queue from app.config import settings from app.core.redis_client import get_redis_client # Configure logging logger.remove() logger.add( sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function} - {message}", level=settings.LOG_LEVEL ) # Create logs directory if it doesn't exist try: log_dir = Path("logs") log_dir.mkdir(parents=True, exist_ok=True) logger.add( "logs/swara_worker_{time:YYYY-MM-DD}.log", rotation="1 day", retention="7 days", format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function} - {message}", level=settings.LOG_LEVEL ) except (PermissionError, OSError) as e: # If we can't write to logs directory, only use stdout logger.warning(f"Cannot create log file: {e}. Using stdout only.") def main(): """Start RQ worker""" logger.info("=" * 70) logger.info("šŸ”§ SWARA Worker Starting...") logger.info("=" * 70) logger.info(f"Environment: {settings.ENV}") logger.info(f"Redis URL: {settings.REDIS_URL}") logger.info(f"Queue Name: {settings.TASK_QUEUE_NAME}") try: # Connect to Redis (decode_responses=False untuk RQ 2.0 compatibility) # Gunakan connection baru, jangan pakai global redis_client logger.info("Creating worker Redis connection...") redis_conn = Redis.from_url( settings.REDIS_URL, decode_responses=False, # PENTING: RQ butuh bytes, bukan string! max_connections=10, socket_connect_timeout=30, socket_timeout=30, socket_keepalive=True, health_check_interval=30 ) redis_conn.ping() logger.info("āœ“ Redis connected") # Create queue queue = Queue(settings.TASK_QUEUE_NAME, connection=redis_conn) logger.info(f"āœ“ Queue '{settings.TASK_QUEUE_NAME}' initialized") logger.info("=" * 70) logger.info("āœ“ Worker ready and listening for tasks...") logger.info("=" * 70) # Start worker (rq 2.0+ doesn't need Connection context) worker = Worker([queue], connection=redis_conn) worker.work(with_scheduler=True) except KeyboardInterrupt: logger.info("\nšŸ›‘ Worker interrupted by user") except Exception as e: logger.error(f"āŒ Worker failed: {e}") sys.exit(1) if __name__ == "__main__": main()