HealthSync_Motivator/app/batch_runner.py
2025-06-20 05:51:38 +00:00

71 lines
2.6 KiB
Python

# 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)