关于 cron-scheduling
面向开发者的 cron 定时任务参考资料,涵盖 Node.js、Java 和 Python。除表达式示例外,还提供锁、错误处理、时区和监控方面的生产环境建议。
主要功能
- 01Cron 表达式语法与示例
- 02Node.js、Java 和 Python 示例
- 03多实例分布式锁建议
- 04错误处理与运行监控建议
适用场景
- 01为服务配置定时清理任务
- 02在多实例部署中避免重复执行
- 03排查耗时或失败的定时任务
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill cron-scheduling安装后在 Claude Code 中输入/cron-scheduling确认已加载。
详细介绍
Cron 调度
Cron 表达式语法
┌─────── minute (0-59)
│ ┌────── hour (0-23)
│ │ ┌───── day of month (1-31)
│ │ │ ┌──── month (1-12)
│ │ │ │ ┌─── day of week (0-7, 0 and 7 = Sunday)
│ │ │ │ │
* * * * *
| 表达式 | 调度时间 |
|---|---|
0 * * * * | 每小时 |
*/15 * * * * | 每 15 分钟 |
0 9 * * 1-5 | 工作日早上 9:00 |
0 0 1 * * | 每月 1 日午夜 |
0 */6 * * * | 每 6 小时 |
Node.js(node-cron)
import cron from 'node-cron';
// Run every day at 2:00 AM
cron.schedule('0 2 * * *', async () => {
console.log('Running daily cleanup...');
await cleanupExpiredSessions();
}, {
timezone: 'America/New_York',
});
// Run every 5 minutes
cron.schedule('*/5 * * * *', async () => {
await syncExternalData();
});
使用分布式锁(防止重复运行)
import { Redlock } from 'redlock';
const redlock = new Redlock([redis]);
cron.schedule('0 * * * *', async () => {
let lock;
try {
lock = await redlock.acquire(['cron:hourly-report'], 60000);
await generateHourlyReport();
} catch (err) {
if (err instanceof Redlock.LockError) return; // Another instance has the lock
throw err;
} finally {
await lock?.release();
}
});
Spring @Scheduled(Java)
@Component
@EnableScheduling
public class ScheduledTasks {
@Scheduled(cron = "0 0 2 * * *") // Daily at 2 AM
public void dailyCleanup() {
sessionRepo.deleteExpired();
}
@Scheduled(fixedRate = 300000) // Every 5 minutes
public void syncData() {
externalService.sync();
}
@Scheduled(fixedDelay = 60000) // 60s after last completion
public void processQueue() {
queueService.processNext();
}
}
分布式调度(ShedLock)
@Scheduled(cron = "0 */10 * * * *")
@SchedulerLock(name = "syncInventory", lockAtLeastFor = "5m", lockAtMostFor = "10m")
public void syncInventory() {
inventoryService.syncAll();
}
Python(APScheduler)
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = AsyncIOScheduler()
@scheduler.scheduled_job(CronTrigger(hour=2, minute=0))
async def daily_cleanup():
await cleanup_expired_sessions()
@scheduler.scheduled_job('interval', minutes=5)
async def sync_data():
await sync_external_data()
scheduler.start()
反模式
| 反模式 | 解决方法 |
|---|---|
| 多个实例上运行 Cron,但未使用锁 | 使用分布式锁(Redlock、ShedLock) |
| 长时间运行的 Cron 阻塞下一次运行 | 对繁重任务使用作业队列 |
| Cron 中没有错误处理 | 使用 try-catch 包装,记录错误并发出告警 |
| 硬编码调度时间 | 使用环境变量或配置 |
| 未监控 Cron 执行情况 | 记录开始和结束时间,跟踪失败情况 |
生产环境检查清单
- 多实例部署时使用分布式锁
- 配置错误处理和告警
- 监控执行时间
- 明确设置时区
- 优雅关闭(完成当前作业)
- 记录 Cron 表达式说明
评论
支持 Markdown