You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.4 KiB
109 lines
2.4 KiB
/**
|
|
* 任务调度服务提供者
|
|
* 负责定时任务系统的初始化
|
|
*/
|
|
|
|
import cron from 'node-cron'
|
|
import config from '../config/index.js'
|
|
|
|
class JobProvider {
|
|
constructor() {
|
|
this.jobs = new Map()
|
|
this.isEnabled = config.jobs.enabled
|
|
}
|
|
|
|
/**
|
|
* 初始化任务调度系统
|
|
*/
|
|
async register() {
|
|
if (!this.isEnabled) {
|
|
console.log('• 任务调度系统已禁用')
|
|
return
|
|
}
|
|
|
|
try {
|
|
// 加载所有任务
|
|
await this.loadJobs()
|
|
console.log('✓ 任务调度系统初始化成功')
|
|
} catch (error) {
|
|
console.error('✗ 任务调度系统初始化失败:', error.message)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 加载所有任务
|
|
*/
|
|
async loadJobs() {
|
|
// 这里可以动态加载任务文件
|
|
// 暂时保留原有的任务加载逻辑
|
|
console.log('• 正在加载定时任务...')
|
|
}
|
|
|
|
/**
|
|
* 注册新任务
|
|
*/
|
|
schedule(name, cronExpression, task, options = {}) {
|
|
if (!this.isEnabled) {
|
|
console.log(`• 任务 ${name} 未注册(任务调度已禁用)`)
|
|
return
|
|
}
|
|
|
|
try {
|
|
const job = cron.schedule(cronExpression, task, {
|
|
timezone: config.jobs.timezone,
|
|
...options
|
|
})
|
|
|
|
this.jobs.set(name, job)
|
|
console.log(`✓ 任务 ${name} 注册成功`)
|
|
return job
|
|
} catch (error) {
|
|
console.error(`✗ 任务 ${name} 注册失败:`, error.message)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 停止指定任务
|
|
*/
|
|
stop(name) {
|
|
const job = this.jobs.get(name)
|
|
if (job) {
|
|
job.stop()
|
|
console.log(`✓ 任务 ${name} 已停止`)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 启动指定任务
|
|
*/
|
|
start(name) {
|
|
const job = this.jobs.get(name)
|
|
if (job) {
|
|
job.start()
|
|
console.log(`✓ 任务 ${name} 已启动`)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 停止所有任务
|
|
*/
|
|
stopAll() {
|
|
this.jobs.forEach((job, name) => {
|
|
job.stop()
|
|
console.log(`✓ 任务 ${name} 已停止`)
|
|
})
|
|
console.log('✓ 所有任务已停止')
|
|
}
|
|
|
|
/**
|
|
* 获取任务列表
|
|
*/
|
|
getJobs() {
|
|
return Array.from(this.jobs.keys())
|
|
}
|
|
}
|
|
|
|
// 导出单例实例
|
|
export default new JobProvider()
|