Skip to content

Commit 499cf04

Browse files
committed
feat: enbale cron
close #17
1 parent 9310f1c commit 499cf04

File tree

2 files changed

+50
-49
lines changed

2 files changed

+50
-49
lines changed

mcim_sync/config.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@ class JobInterval(BaseModel):
5555
modrinth_tags: int = 60 * 60 * 24 # 24 hours
5656
global_statistics: int = 60 * 60 * 24 # 24 hours
5757

58+
class CronTrigger(BaseModel):
59+
curseforge_refresh: str = "0 */2 * * *" # Every 2 hours
60+
modrinth_refresh: str = "0 */2 * * *" # Every 2 hours
61+
curseforge_refresh_full: str = "0 2 * * *" # Every day at 02:00
62+
modrinth_refresh_full: str = "0 4 * * *" # Every day at 04:00
63+
sync_curseforge_by_queue: str = "*/20 * * * *" # Every 20 minutes
64+
sync_modrinth_by_queue: str = "10,30,50 * * * *" # Every 10, 30, 50 minutes
65+
sync_modrinth_by_search: str = "30 */2 * * *" # Every 2 hours at 30 minutes past the hour
66+
sync_curseforge_by_search: str = "0 */2 * * *" # Every 2 hours at 30 minutes past odd hours
67+
curseforge_categories: str = "0 0 * * *" # Daily at 00:00
68+
modrinth_tags: str = "0 0 * * *" # Daily at 00:00
69+
global_statistics: str = "0 0 * * *" # Daily at 00:00
5870

5971
class DomainRateLimitModel(BaseModel):
6072
"""域名限速配置 - 令牌桶算法"""
@@ -72,6 +84,8 @@ class ConfigModel(BaseModel):
7284

7385
job_config: JobConfigModel = JobConfigModel()
7486
interval: JobInterval = JobInterval()
87+
use_cron: bool = True # 是否使用 CronTrigger,如果为 False 则使用 IntervalTrigger
88+
cron_trigger: CronTrigger = CronTrigger()
7589

7690
max_workers: int = 8
7791
curseforge_chunk_size: int = 1000

start.py

Lines changed: 36 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from apscheduler.schedulers.background import BackgroundScheduler
22
from apscheduler.triggers.interval import IntervalTrigger
33
from apscheduler.triggers.cron import CronTrigger
4-
import datetime
4+
from datetime import datetime
55
import time
66

77
from mcim_sync.database.mongodb import init_mongodb_syncengine
@@ -37,116 +37,103 @@ def main():
3737
# 创建调度器
3838
scheduler = BackgroundScheduler()
3939
if config.job_config.curseforge_refresh:
40-
# 添加定时刷新任务,每小时执行一次
40+
curseforge_refresh_trigger = CronTrigger.from_crontab(config.cron_trigger.curseforge_refresh) if config.use_cron else IntervalTrigger(seconds=config.interval.curseforge_refresh)
4141
curseforge_refresh_job = scheduler.add_job(
4242
refresh_curseforge_with_modify_date,
43-
trigger=IntervalTrigger(seconds=config.interval.curseforge_refresh),
43+
trigger=curseforge_refresh_trigger,
4444
name="curseforge_refresh",
4545
)
46+
log.info(f"Next run time of curseforge_refresh: {curseforge_refresh_trigger.get_next_fire_time(None, datetime.now())}")
4647

4748
if config.job_config.modrinth_refresh:
49+
modrinth_refresh_trigger = CronTrigger.from_crontab(config.cron_trigger.modrinth_refresh) if config.use_cron else IntervalTrigger(seconds=config.interval.modrinth_refresh)
4850
modrinth_refresh_job = scheduler.add_job(
4951
refresh_modrinth_with_modify_date,
50-
trigger=IntervalTrigger(seconds=config.interval.modrinth_refresh),
52+
trigger=modrinth_refresh_trigger,
5153
name="modrinth_refresh",
5254
)
55+
log.info(f"Next run time of modrinth_refresh: {modrinth_refresh_trigger.get_next_fire_time(None, datetime.now())}")
5356

5457
if config.job_config.curseforge_refresh_full:
55-
# 添加全量刷新任务,每 48 小时执行一次
58+
curseforge_full_refresh_trigger = CronTrigger.from_crontab(config.cron_trigger.curseforge_refresh_full) if config.use_cron else IntervalTrigger(seconds=config.interval.curseforge_refresh_full)
5659
curseforge_full_refresh_job = scheduler.add_job(
5760
sync_curseforge_full,
58-
trigger=IntervalTrigger(seconds=config.interval.curseforge_refresh_full),
61+
trigger=curseforge_full_refresh_trigger,
5962
name="curseforge_full_refresh",
6063
)
64+
log.info(f"Next run time of curseforge_full_refresh: {curseforge_full_refresh_trigger.get_next_fire_time(None, datetime.now())}")
6165

6266
if config.job_config.modrinth_refresh_full:
63-
# 添加全量刷新任务,每 48 小时执行一次
67+
modrinth_full_refresh_trigger = CronTrigger.from_crontab(config.cron_trigger.modrinth_refresh_full) if config.use_cron else IntervalTrigger(seconds=config.interval.modrinth_refresh_full)
6468
modrinth_full_refresh_job = scheduler.add_job(
65-
sync_modrinth_queue,
66-
trigger=IntervalTrigger(seconds=config.interval.modrinth_refresh_full),
69+
refresh_modrinth_full,
70+
trigger=modrinth_full_refresh_trigger,
6771
name="modrinth_full_refresh",
6872
)
73+
log.info(f"Next run time of modrinth_full_refresh: {modrinth_full_refresh_trigger.get_next_fire_time(None, datetime.now())}")
6974

7075
if config.job_config.sync_curseforge_by_queue:
71-
# 添加定时同步任务,用于检查 api 未找到的请求数据
76+
curseforge_sync_trigger = CronTrigger.from_crontab(config.cron_trigger.sync_curseforge_by_queue) if config.use_cron else IntervalTrigger(seconds=config.interval.sync_curseforge_by_queue)
7277
curseforge_sync_job = scheduler.add_job(
7378
sync_curseforge_queue,
74-
trigger=IntervalTrigger(seconds=config.interval.sync_curseforge_by_queue),
79+
trigger=curseforge_sync_trigger,
7580
name="sync_curseforge_queue",
7681
)
82+
log.info(f"Next run time of sync_curseforge_queue: {curseforge_sync_trigger.get_next_fire_time(None, datetime.now())}")
7783

7884
if config.job_config.sync_modrinth_by_queue:
79-
# 由 sync_modrinth_by_search 平替
85+
modrinth_sync_trigger = CronTrigger.from_crontab(config.cron_trigger.sync_modrinth_by_queue) if config.use_cron else IntervalTrigger(seconds=config.interval.sync_modrinth_by_queue)
8086
modrinth_sync_job = scheduler.add_job(
8187
sync_modrinth_queue,
82-
trigger=IntervalTrigger(seconds=config.interval.sync_modrinth_by_queue),
88+
trigger=modrinth_sync_trigger,
8389
name="sync_modrinth_queue",
8490
)
91+
log.info(f"Next run time of sync_modrinth_by_queue: {modrinth_sync_trigger.get_next_fire_time(None, datetime.now())}")
8592

8693
if config.job_config.sync_modrinth_by_search:
94+
sync_modrinth_by_search_trigger = CronTrigger.from_crontab(config.cron_trigger.sync_modrinth_by_search) if config.use_cron else IntervalTrigger(seconds=config.interval.sync_modrinth_by_search)
8795
sync_modrinth_by_search_job = scheduler.add_job(
8896
sync_modrinth_by_search,
89-
trigger=IntervalTrigger(seconds=config.interval.sync_modrinth_by_search),
97+
trigger=sync_modrinth_by_search_trigger,
9098
name="sync_modrinth_by_search",
9199
)
100+
log.info(f"Next run time of sync_modrinth_by_search: {sync_modrinth_by_search_trigger.get_next_fire_time(None, datetime.now())}")
92101

93102
if config.job_config.sync_curseforge_by_search:
103+
sync_curseforge_by_search_trigger = CronTrigger.from_crontab(config.cron_trigger.sync_curseforge_by_search) if config.use_cron else IntervalTrigger(seconds=config.interval.sync_curseforge_by_search)
94104
sync_curseforge_by_search_job = scheduler.add_job(
95105
sync_curseforge_by_search,
96-
trigger=IntervalTrigger(seconds=config.interval.sync_curseforge_by_search),
106+
trigger=sync_curseforge_by_search_trigger,
97107
name="sync_curseforge_by_search",
98108
)
109+
log.info(f"Next run time of sync_curseforge_by_search: {sync_curseforge_by_search_trigger.get_next_fire_time(None, datetime.now())}")
99110

100111
if config.job_config.curseforge_categories:
112+
curseforge_categories_trigger = CronTrigger.from_crontab(config.cron_trigger.curseforge_categories) if config.use_cron else IntervalTrigger(seconds=config.interval.curseforge_categories)
101113
curseforge_categories_refresh_job = scheduler.add_job(
102114
refresh_curseforge_categories,
103-
# trigger=IntervalTrigger(seconds=config.interval.curseforge_categories),
104-
# 使用 CronTrigger 每天执行一次,指定 0 点
105-
trigger=CronTrigger(
106-
hour="0",
107-
minute="0",
108-
second="0",
109-
day_of_week="*",
110-
month="*",
111-
year="*",
112-
),
115+
trigger=curseforge_categories_trigger,
113116
name="curseforge_categories_refresh",
114-
# next_run_time=datetime.datetime.now(), # 立即执行一次任务
115117
)
118+
log.info(f"Next run time of curseforge_categories_refresh: {curseforge_categories_trigger.get_next_fire_time(None, datetime.now())}")
116119

117120
if config.job_config.modrinth_tags:
121+
modrinth_tags_trigger = CronTrigger.from_crontab(config.cron_trigger.modrinth_tags) if config.use_cron else IntervalTrigger(seconds=config.interval.modrinth_tags)
118122
modrinth_refresh_tags_job = scheduler.add_job(
119123
refresh_modrinth_tags,
120-
# trigger=IntervalTrigger(seconds=config.interval.modrinth_tags),
121-
# 使用 CronTrigger 每天执行一次
122-
trigger=CronTrigger(
123-
hour="0",
124-
minute="0",
125-
second="0",
126-
day_of_week="*",
127-
month="*",
128-
year="*",
129-
),
124+
trigger=modrinth_tags_trigger,
130125
name="modrinth_refresh_tags",
131-
# next_run_time=datetime.datetime.now(), # 立即执行一次任务
132126
)
127+
log.info(f"Next run time of modrinth_refresh_tags: {modrinth_tags_trigger.get_next_fire_time(None, datetime.now())}")
133128

134129
if config.telegram_bot and config.job_config.global_statistics:
135-
# 单独发布统计信息
130+
statistics_trigger = CronTrigger.from_crontab(config.cron_trigger.global_statistics) if config.use_cron else IntervalTrigger(seconds=config.interval.global_statistics)
136131
statistics_job = scheduler.add_job(
137132
send_statistics_to_telegram,
138-
# trigger=IntervalTrigger(seconds=config.interval.global_statistics),
139-
# 使用 CronTrigger 每天执行一次
140-
trigger=CronTrigger(
141-
hour="0",
142-
minute="0",
143-
second="0",
144-
day_of_week="*",
145-
month="*",
146-
year="*",
147-
),
133+
trigger=statistics_trigger,
148134
name="statistics",
149135
)
136+
log.info(f"Next run time of global_statistics: {statistics_trigger.get_next_fire_time(None, datetime.now())}")
150137

151138
# 启动调度器
152139
scheduler.start()
@@ -161,4 +148,4 @@ def main():
161148

162149

163150
if __name__ == "__main__":
164-
main()
151+
main()

0 commit comments

Comments
 (0)