11import json
22from apscheduler .events import EVENT_ALL
3- from apscheduler .executors .pool import ThreadPoolExecutor , ProcessPoolExecutor
4- from apscheduler .schedulers . background import BackgroundScheduler
3+ from apscheduler .executors .asyncio import AsyncIOExecutor
4+ from apscheduler .executors . pool import ProcessPoolExecutor
55from apscheduler .jobstores .memory import MemoryJobStore
66from apscheduler .jobstores .redis import RedisJobStore
77from apscheduler .jobstores .sqlalchemy import SQLAlchemyJobStore
8+ from apscheduler .schedulers .asyncio import AsyncIOScheduler
89from apscheduler .triggers .cron import CronTrigger
10+ from asyncio import iscoroutinefunction
911from datetime import datetime , timedelta
1012from sqlalchemy .engine import create_engine
1113from sqlalchemy .orm import sessionmaker
@@ -109,9 +111,9 @@ def __find_recent_workday(cls, day: int):
109111 )
110112 ),
111113}
112- executors = {'default' : ThreadPoolExecutor ( 20 ), 'processpool' : ProcessPoolExecutor (5 )}
114+ executors = {'default' : AsyncIOExecutor ( ), 'processpool' : ProcessPoolExecutor (5 )}
113115job_defaults = {'coalesce' : False , 'max_instance' : 1 }
114- scheduler = BackgroundScheduler ()
116+ scheduler = AsyncIOScheduler ()
115117scheduler .configure (jobstores = job_stores , executors = executors , job_defaults = job_defaults )
116118
117119
@@ -132,9 +134,7 @@ async def init_system_scheduler(cls):
132134 async with AsyncSessionLocal () as session :
133135 job_list = await JobDao .get_job_list_for_scheduler (session )
134136 for item in job_list :
135- query_job = cls .get_scheduler_job (job_id = str (item .job_id ))
136- if query_job :
137- cls .remove_scheduler_job (job_id = str (item .job_id ))
137+ cls .remove_scheduler_job (job_id = str (item .job_id ))
138138 cls .add_scheduler_job (item )
139139 scheduler .add_listener (cls .scheduler_event_listener , EVENT_ALL )
140140 logger .info ('系统初始定时任务加载成功' )
@@ -169,6 +169,10 @@ def add_scheduler_job(cls, job_info: JobModel):
169169 :param job_info: 任务对象信息
170170 :return:
171171 """
172+ job_func = eval (job_info .invoke_target )
173+ job_executor = job_info .job_executor
174+ if iscoroutinefunction (job_func ):
175+ job_executor = 'default'
172176 scheduler .add_job (
173177 func = eval (job_info .invoke_target ),
174178 trigger = MyCronTrigger .from_crontab (job_info .cron_expression ),
@@ -180,7 +184,7 @@ def add_scheduler_job(cls, job_info: JobModel):
180184 coalesce = True if job_info .misfire_policy == '2' else False ,
181185 max_instances = 3 if job_info .concurrent == '0' else 1 ,
182186 jobstore = job_info .job_group ,
183- executor = job_info . job_executor ,
187+ executor = job_executor ,
184188 )
185189
186190 @classmethod
@@ -191,6 +195,10 @@ def execute_scheduler_job_once(cls, job_info: JobModel):
191195 :param job_info: 任务对象信息
192196 :return:
193197 """
198+ job_func = eval (job_info .invoke_target )
199+ job_executor = job_info .job_executor
200+ if iscoroutinefunction (job_func ):
201+ job_executor = 'default'
194202 scheduler .add_job (
195203 func = eval (job_info .invoke_target ),
196204 trigger = 'date' ,
@@ -203,7 +211,7 @@ def execute_scheduler_job_once(cls, job_info: JobModel):
203211 coalesce = True if job_info .misfire_policy == '2' else False ,
204212 max_instances = 3 if job_info .concurrent == '0' else 1 ,
205213 jobstore = job_info .job_group ,
206- executor = job_info . job_executor ,
214+ executor = job_executor ,
207215 )
208216
209217 @classmethod
@@ -214,7 +222,9 @@ def remove_scheduler_job(cls, job_id: Union[str, int]):
214222 :param job_id: 任务id
215223 :return:
216224 """
217- scheduler .remove_job (job_id = str (job_id ))
225+ query_job = cls .get_scheduler_job (job_id = job_id )
226+ if query_job :
227+ scheduler .remove_job (job_id = str (job_id ))
218228
219229 @classmethod
220230 def scheduler_event_listener (cls , event ):
0 commit comments