71 lines
2.6 KiB
Python
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) |