"""
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()