# app/batch_runner.py """ HealthSync Motivator Batch 메인 실행파일 (크론탭용) """ import asyncio import sys from datetime import datetime from app.config.settings import settings from app.utils.database_utils import db from app.utils.logger import batch_logger from app.services.motivation_service import motivation_service async def main(): """메인 배치 실행 함수""" start_time = datetime.now() batch_logger.info(f"🚀 {settings.app_name} 배치 시작 - {start_time}") try: # 1. 데이터베이스 연결 테스트 batch_logger.info("🔍 데이터베이스 연결 테스트...") connection_ok = await db.test_connection() if not connection_ok: raise Exception("데이터베이스 연결 실패") batch_logger.info("✅ 데이터베이스 연결 성공") # 2. 독려 메시지 배치 처리 실행 batch_logger.info("💌 독려 메시지 배치 처리 시작...") results = await motivation_service.process_all_users() # 3. 처리 결과 요약 end_time = datetime.now() duration = end_time - start_time batch_logger.info(f"🎉 배치 처리 완료!") batch_logger.info(f"📊 처리 결과:") batch_logger.info(f" - 전체 사용자: {results['total_users']}명") batch_logger.info(f" - 처리 완료: {results['processed_users']}명") batch_logger.info(f" - 메시지 발송: {results['sent_messages']}건") batch_logger.info(f" - 건너뛴 사용자: {results['skipped_users']}명") batch_logger.info(f" - 실패한 사용자: {results['failed_users']}명") batch_logger.info(f"⏱️ 총 소요시간: {duration}") # 4. 성공 종료 return 0 except Exception as e: batch_logger.error(f"❌ 배치 처리 실패: {str(e)}") return 1 finally: # 5. 데이터베이스 연결 해제 try: await db.disconnect() batch_logger.info("🔌 데이터베이스 연결 해제 완료") except Exception as e: batch_logger.error(f"❌ 데이터베이스 연결 해제 실패: {str(e)}") if __name__ == "__main__": """크론탭에서 실행되는 엔트리포인트""" try: # 비동기 메인 함수 실행 exit_code = asyncio.run(main()) sys.exit(exit_code) except KeyboardInterrupt: batch_logger.info("⚠️ 사용자에 의한 배치 중단") sys.exit(1) except Exception as e: batch_logger.error(f"❌ 배치 실행 중 예상치 못한 오류: {str(e)}") sys.exit(1)