Files
tauri-meeting/src-tauri/src/task/scheduled_restart.rs
O昵称重要吗O 78af453fe1 chore: 初始化项目基础结构和资源文件
- 添加项目图标文件(app-icon.png、各平台图标)
- 配置开发环境文件(.env、.nvmrc、.npmrc)
- 添加静态资源文件(背景图片、字体、音频)
- 初始化Tauri后端结构(build.rs、main.rs、模块文件)
- 配置前端项目结构(TypeScript、Vue组件、样式)
- 添加Node.js API服务基础结构
- 配置构建和开发工具(vite、prettier、gitignore)
2026-03-13 10:03:05 +08:00

52 lines
1.8 KiB
Rust

use once_cell::sync::OnceCell;
use tauri::AppHandle;
use tokio_cron_scheduler::{Job, JobScheduler};
use tracing::info;
/// 全局调度器实例
/// 使用 OnceCell 确保只创建一次,并在应用生命周期内保持活动
static SCHEDULER: OnceCell<JobScheduler> = OnceCell::new();
/// 启动每日凌晨1点定时重启任务
///
/// 注意:此函数会启动一个后台任务,调度器会在后台持续运行
/// 调度器的生命周期与应用程序相同
pub async fn start_scheduled_restart_task(app_handle: AppHandle) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
// 如果调度器已经存在,直接返回
if SCHEDULER.get().is_some() {
info!("定时重启任务已经启动,跳过重复初始化");
return Ok(());
}
// 创建调度器
let scheduler = JobScheduler::new().await?;
// 创建每天凌晨1点执行的定时任务
// cron表达式: "0 0 1 * * *" 表示每天1点0分0秒执行
// 格式: sec min hour day_of_month month day_of_week
let job = Job::new_async("0 0 1 * * *", move |_uuid, _l| {
let app_handle_clone = app_handle.clone();
Box::pin(async move {
info!("定时重启任务已触发,正在重启应用程序...");
// 重启应用
app_handle_clone.restart();
// 注意:由于重启操作会终止程序,下面的代码不会执行
})
})?;
// 添加任务到调度器
scheduler.add(job).await?;
// 启动调度器
scheduler.start().await?;
// 将调度器保存到全局静态变量中,确保其不会被清理
SCHEDULER.set(scheduler).map_err(|_| "定时任务调度器已初始化")?;
info!("定时重启任务已启动 - 应用程序将在每天凌晨1点重启");
Ok(())
}