You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
定时数据同步任务
使用 APScheduler 定时同步数据
"""
import logging
from datetime import datetime
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
from app.services.data_sync_service import DataSyncService
from app.services.amazing_data_service import amazing_data_service
logger = logging.getLogger(__name__)
# 全局调度器
scheduler = AsyncIOScheduler()
async def sync_kline_task():
"""定时同步 K 线数据任务"""
try:
logger.info("Starting scheduled kline data sync")
# 确保连接
if not amazing_data_service.ensure_connected():
logger.error("Failed to connect to amazingData for scheduled sync")
return
# 同步默认品种和周期
result = await DataSyncService.sync_all_symbols()
logger.info(f"Scheduled sync completed: {result}")
except Exception as e:
logger.error(f"Scheduled sync failed: {e}")
async def sync_realtime_task():
"""定时同步实时行情任务"""
try:
logger.info("Starting scheduled realtime quote sync")
symbols = DataSyncService.DEFAULT_SYMBOLS
count = DataSyncService.sync_realtime_quotes(symbols)
logger.info(f"Synced {count} realtime quotes")
except Exception as e:
logger.error(f"Realtime sync failed: {e}")
def start_scheduler():
"""启动定时任务调度器"""
try:
# 连接 amazingData长连接
amazing_data_service.connect()
# K 线数据同步:每分钟执行一次
scheduler.add_job(
sync_kline_task,
trigger=CronTrigger(second=0), # 每分钟的第 0 秒
id='sync_kline',
name='Sync Kline Data',
replace_existing=True
)
# 实时行情同步:每 5 秒执行一次
scheduler.add_job(
sync_realtime_task,
trigger='interval',
seconds=5,
id='sync_realtime',
name='Sync Realtime Quotes',
replace_existing=True
)
scheduler.start()
logger.info("Scheduler started successfully")
except Exception as e:
logger.error(f"Failed to start scheduler: {e}")
raise
def stop_scheduler():
"""停止定时任务调度器"""
try:
scheduler.shutdown()
logger.info("Scheduler stopped")
# 断开 amazingData 连接
amazing_data_service.disconnect()
except Exception as e:
logger.error(f"Error stopping scheduler: {e}")
def get_scheduler() -> AsyncIOScheduler:
"""获取调度器实例"""
return scheduler