mcp_stdio_proxy/server/task/
schedule_task.rs

1use crate::server::task::schedule_check_mcp_live;
2use log::{debug, info, warn};
3use std::sync::Arc;
4use std::sync::atomic::{AtomicBool, Ordering};
5use tokio::time::{Duration, interval};
6
7/// 启动定时任务,定期检查MCP服务状态
8///
9/// 这个函数会创建一个tokio定时任务,每隔指定的时间间隔执行一次`schedule_check_mcp_live`函数
10/// 用于检查和清理不再需要的MCP服务资源
11pub async fn start_schedule_task() {
12    info!("启动MCP服务状态检查定时任务");
13
14    // 创建一个tokio定时器,每30秒执行一次
15    let mut interval = interval(Duration::from_secs(60));
16
17    // 使用原子布尔值来跟踪任务是否正在执行
18    let is_running = Arc::new(AtomicBool::new(false));
19
20    // 启动一个新的异步任务
21    tokio::spawn(async move {
22        loop {
23            // 等待下一个时间点
24            interval.tick().await;
25
26            // 检查是否有任务正在执行
27            if is_running.load(Ordering::SeqCst) {
28                warn!("上一次MCP服务状态检查任务尚未完成,跳过本次执行");
29                continue;
30            }
31
32            // 标记任务开始执行
33            is_running.store(true, Ordering::SeqCst);
34
35            // 执行MCP服务状态检查
36            debug!("执行MCP服务状态定期检查...");
37
38            // 在一个新的任务中执行检查,这样可以捕获任何异常
39            let is_running_clone = is_running.clone();
40            tokio::spawn(async move {
41                // 执行检查任务
42                match tokio::time::timeout(
43                    Duration::from_secs(25), // 设置超时时间为25秒,小于间隔时间
44                    schedule_check_mcp_live(),
45                )
46                .await
47                {
48                    Ok(_) => {
49                        debug!("MCP服务状态检查完成");
50                    }
51                    Err(_) => {
52                        warn!("MCP服务状态检查任务超时");
53                    }
54                }
55
56                // 无论成功还是失败,都标记任务已完成
57                is_running_clone.store(false, Ordering::SeqCst);
58            });
59        }
60    });
61
62    info!("MCP服务状态检查定时任务已启动");
63}