Skip to main content

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!("Start the MCP service status check scheduled task");
13
14    // 创建一个tokio定时器,每20秒执行一次
15    let mut interval = interval(Duration::from_secs(20));
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!(
29                    "The last MCP service status check task has not been completed and this execution will be skipped."
30                );
31                continue;
32            }
33
34            // 标记任务开始执行
35            is_running.store(true, Ordering::SeqCst);
36
37            // 执行MCP服务状态检查
38            debug!("Perform periodic checks on MCP service status...");
39
40            // 在一个新的任务中执行检查,这样可以捕获任何异常
41            let is_running_clone = is_running.clone();
42            tokio::spawn(async move {
43                // 执行检查任务
44                match tokio::time::timeout(
45                    Duration::from_secs(10), // 设置超时时间为10秒,小于间隔时间
46                    schedule_check_mcp_live(),
47                )
48                .await
49                {
50                    Ok(_) => {
51                        debug!("MCP service status check completed");
52                    }
53                    Err(_) => {
54                        warn!("MCP service status check task timed out");
55                    }
56                }
57
58                // 无论成功还是失败,都标记任务已完成
59                is_running_clone.store(false, Ordering::SeqCst);
60            });
61        }
62    });
63
64    info!("MCP service status check scheduled task has been started");
65}