This commit is contained in:
jxxghp 2023-07-10 19:18:47 +08:00
parent 28b429a5d7
commit 1a3695a38c
4 changed files with 79 additions and 7 deletions

View File

@ -7,7 +7,10 @@ from app import schemas
from app.chain.dashboard import DashboardChain from app.chain.dashboard import DashboardChain
from app.core.config import settings from app.core.config import settings
from app.core.security import verify_token from app.core.security import verify_token
from app.scheduler import SchedulerChain, Scheduler
from app.utils.string import StringUtils
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
from app.utils.timer import TimerUtils
router = APIRouter() router = APIRouter()
@ -60,3 +63,30 @@ def downloader(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
upload_size=transfer_info.upload_size, upload_size=transfer_info.upload_size,
free_space=free_space free_space=free_space
) )
@router.get("/schedule", summary="后台服务", response_model=List[schemas.ScheduleInfo])
def schedule(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
查询后台服务信息
"""
# 返回计时任务
schedulers = []
# 去重
added = []
jobs = Scheduler().list()
for job in jobs:
if job.name not in added:
added.append(job.name)
else:
continue
if not StringUtils.is_chinese(job.name):
continue
schedulers.append(schemas.ScheduleInfo(
id=job.id,
name=job.name,
status="等待" if job.pending else "运行中",
next_run=TimerUtils.time_difference(job.next_run_time) or "已停止"
))
return schedulers

View File

@ -45,24 +45,28 @@ class Scheduler(metaclass=Singleton):
self._scheduler.add_job(CookieCloudChain().process, self._scheduler.add_job(CookieCloudChain().process,
"interval", "interval",
minutes=settings.COOKIECLOUD_INTERVAL, minutes=settings.COOKIECLOUD_INTERVAL,
next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1)) next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1),
name="CookieCloud同步")
# 新增订阅时搜索5分钟检查一次 # 新增订阅时搜索5分钟检查一次
self._scheduler.add_job(SubscribeChain().search, "interval", minutes=5, kwargs={'state': 'N'}) self._scheduler.add_job(SubscribeChain().search, "interval",
minutes=5, kwargs={'state': 'N'})
# 订阅状态每隔12小时刷新一次 # 订阅状态每隔12小时搜索一次
self._scheduler.add_job(SubscribeChain().search, "interval", hours=12, kwargs={'state': 'R'}) self._scheduler.add_job(SubscribeChain().search, "interval",
hours=12, kwargs={'state': 'R'}, name="订阅搜索")
# 站点首页种子定时刷新缓存并匹配订阅 # 站点首页种子定时刷新缓存并匹配订阅
triggers = TimerUtils.random_scheduler(num_executions=20) triggers = TimerUtils.random_scheduler(num_executions=20)
for trigger in triggers: for trigger in triggers:
self._scheduler.add_job(SubscribeChain().refresh, "cron", hour=trigger.hour, minute=trigger.minute) self._scheduler.add_job(SubscribeChain().refresh, "cron",
hour=trigger.hour, minute=trigger.minute, name="订阅刷新")
# 豆瓣同步每30分钟 # 豆瓣同步每30分钟
self._scheduler.add_job(DoubanChain().sync, "interval", minutes=30) self._scheduler.add_job(DoubanChain().sync, "interval", minutes=30, name="同步豆瓣想看")
# 下载器文件转移每5分钟 # 下载器文件转移每5分钟
self._scheduler.add_job(TransferChain().process, "interval", minutes=5) self._scheduler.add_job(TransferChain().process, "interval", minutes=5, name="下载文件整理")
# 公共定时服务 # 公共定时服务
self._scheduler.add_job(SchedulerChain().scheduler_job, "interval", minutes=10) self._scheduler.add_job(SchedulerChain().scheduler_job, "interval", minutes=10)
@ -73,6 +77,12 @@ class Scheduler(metaclass=Singleton):
# 启动定时服务 # 启动定时服务
self._scheduler.start() self._scheduler.start()
def list(self):
"""
当前所有任务
"""
return self._scheduler.get_jobs()
def stop(self): def stop(self):
""" """
关闭定时服务 关闭定时服务

View File

@ -49,3 +49,14 @@ class DownloaderInfo(BaseModel):
upload_size: Optional[float] = 0.0 upload_size: Optional[float] = 0.0
# 剩余空间 # 剩余空间
free_space: Optional[float] = 0.0 free_space: Optional[float] = 0.0
class ScheduleInfo(BaseModel):
# ID
id: Optional[str] = None
# 名称
name: Optional[str] = None
# 状态
status: Optional[str] = None
# 下次执行时间
next_run: Optional[str] = None

View File

@ -37,3 +37,24 @@ class TimerUtils:
trigger.append(random_trigger) trigger.append(random_trigger)
return trigger return trigger
from datetime import datetime, timedelta
@staticmethod
def time_difference(input_datetime: datetime) -> str:
current_datetime = datetime.datetime.now(datetime.timezone.utc).astimezone()
time_difference = input_datetime - current_datetime
days = time_difference.days
hours, remainder = divmod(time_difference.seconds, 3600)
minutes, _ = divmod(remainder, 60)
time_difference_string = ""
if days > 0:
time_difference_string += f"{days}"
if hours > 0:
time_difference_string += f"{hours}小时"
if minutes > 0:
time_difference_string += f"{minutes}分钟"
return time_difference_string