node-cron 与 Oracle 数据库集成:企业级定时任务
【免费下载链接】node-cron Cron for NodeJS. 项目地址: https://gitcode.com/gh_mirrors/no/node-cron
一、企业级定时任务的痛点与解决方案
你是否还在为 Oracle 数据库的定时备份、数据同步任务而烦恼?传统的操作系统级定时任务(如 Linux 的 Crontab)配置复杂,且难以与 Node.js 应用集成。本文将介绍如何使用 node-cron 实现企业级 Oracle 数据库定时任务,解决任务调度、错误处理和日志记录等核心问题。
完成本文学习后,你将能够:
- 使用 node-cron 调度 Oracle 数据库任务
- 实现任务失败重试与通知机制
- 构建高可用的定时任务系统
二、node-cron 基础
2.1 node-cron 简介
node-cron 是一个基于 Node.js 的定时任务调度库,支持 Cron 语法和日期对象两种触发方式。其核心功能由 CronJob 类 实现,支持任务启动/停止、时间调整和回调函数注册等特性。
项目结构中,主要代码位于 src/ 目录,包含任务调度核心逻辑;示例代码位于 examples/ 目录,提供了多种定时任务场景的实现。
2.2 安装与基本使用
通过 npm 安装 node-cron:
npm install cron
基本用法示例(每秒钟执行一次任务):
import { CronJob } from 'cron';
const job = new CronJob('* * * * * *', function() {
const d = new Date();
console.log('任务执行时间:', d);
});
job.start();
更详细的使用示例可参考 examples/basic.mjs。
2.3 Cron 语法
node-cron 支持标准的 Cron 语法,格式如下(6个字段,从秒到年):
秒(0-59) 分(0-59) 时(0-23) 日(1-31) 月(1-12) 星期(0-7)
常用表达式示例:
0 0 * * *:每天午夜执行0 */30 * * * *:每30分钟执行0 0 9-17 * * 1-5:工作日9点到17点每小时执行
三、Oracle 数据库连接
3.1 安装 Oracle 客户端
使用 Node.js 连接 Oracle 数据库需要安装 Oracle 客户端和相应的驱动:
npm install oracledb
3.2 数据库连接配置
创建数据库连接配置文件 dbconfig.js:
export default {
user: "SYSTEM",
password: "password",
connectString: "localhost:1521/ORCLCDB"
};
3.3 连接测试代码
import oracledb from 'oracledb';
import dbConfig from './dbconfig.js';
async function testConnection() {
let connection;
try {
connection = await oracledb.getConnection(dbConfig);
console.log('数据库连接成功');
} catch (err) {
console.error('连接失败:', err);
} finally {
if (connection) {
try {
await connection.close();
} catch (err) {
console.error('关闭连接失败:', err);
}
}
}
}
testConnection();
四、node-cron 与 Oracle 集成实现
4.1 定时备份实现
创建数据库备份任务 examples/oracle_backup.mjs:
import { CronJob } from 'cron';
import oracledb from 'oracledb';
import dbConfig from './dbconfig.js';
import fs from 'fs';
import path from 'path';
// 备份目录
const BACKUP_DIR = path.join(process.cwd(), 'backups');
// 确保备份目录存在
if (!fs.existsSync(BACKUP_DIR)) {
fs.mkdirSync(BACKUP_DIR);
}
// 数据库备份函数
async function backupDatabase() {
let connection;
try {
connection = await oracledb.getConnection(dbConfig);
// 查询数据
const result = await connection.execute('SELECT * FROM employees');
// 保存备份文件
const timestamp = new Date().toISOString().replace(/:/g, '-');
const backupPath = path.join(BACKUP_DIR, `backup_${timestamp}.json`);
fs.writeFileSync(backupPath, JSON.stringify(result.rows));
console.log(`备份成功: ${backupPath}`);
} catch (err) {
console.error('备份失败:', err);
} finally {
if (connection) {
try {
await connection.close();
} catch (err) {
console.error('关闭连接失败:', err);
}
}
}
}
// 创建每天午夜执行的备份任务
const job = new CronJob({
cronTime: '0 0 * * *',
onTick: backupDatabase,
start: true,
timeZone: 'Asia/Shanghai',
errorHandler: (err) => {
console.error('定时任务错误:', err);
}
});
console.log('数据库备份任务已启动');
四、企业级特性实现
4.1 任务失败重试机制
通过 node-cron 的 errorHandler 和自定义重试逻辑实现任务失败重试:
// 带重试机制的任务执行函数
async function executeWithRetry(task, maxRetries = 3, retryDelay = 5000) {
let retries = 0;
while (retries < maxRetries) {
try {
await task();
return true;
} catch (err) {
retries++;
console.error(`任务失败,重试 ${retries}/${maxRetries}`, err);
if (retries >= maxRetries) {
console.error('达到最大重试次数,任务执行失败');
return false;
}
await new Promise(resolve => setTimeout(resolve, retryDelay));
}
}
}
// 使用重试机制包装数据库备份任务
const backupJob = new CronJob({
cronTime: '0 0 * * *',
onTick: () => executeWithRetry(backupDatabase),
start: true,
timeZone: 'Asia/Shanghai'
});
4.2 任务执行日志
使用 winston 库实现任务日志记录:
npm install winston
创建日志工具 logger.js:
import winston from 'winston';
import path from 'path';
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: path.join('logs', 'error.log'), level: 'error' }),
new winston.transports.File({ filename: path.join('logs', 'combined.log') })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
}));
}
export default logger;
在任务中使用日志:
import logger from './logger.js';
async function backupDatabase() {
logger.info('开始数据库备份任务');
try {
// 备份逻辑...
logger.info(`备份成功: ${backupPath}`);
} catch (err) {
logger.error('备份失败', { error: err.message, stack: err.stack });
throw err; // 抛出错误,触发重试机制
}
}
4.3 任务监控与通知
实现任务执行状态通知功能(邮件通知):
npm install nodemailer
创建通知工具 notification.js:
import nodemailer from 'nodemailer';
import logger from './logger.js';
// 邮件配置
const transporter = nodemailer.createTransport({
host: 'smtp.example.com',
port: 587,
secure: false,
auth: {
user: 'your-email@example.com',
pass: 'your-password'
}
});
// 发送任务失败通知
async function sendFailureNotification(taskName, error) {
try {
await transporter.sendMail({
from: '"任务监控系统" <monitor@example.com>',
to: 'admin@example.com',
subject: `[错误] ${taskName} 执行失败`,
text: `任务 ${taskName} 执行失败,错误信息:\n${error.stack}`
});
logger.info('任务失败通知已发送');
} catch (err) {
logger.error('发送通知失败', err);
}
}
export { sendFailureNotification };
在任务错误处理中集成通知功能:
import { sendFailureNotification } from './notification.js';
const backupJob = new CronJob({
cronTime: '0 0 * * *',
onTick: () => executeWithRetry(backupDatabase).catch(async (err) => {
await sendFailureNotification('数据库备份任务', err);
}),
start: true,
timeZone: 'Asia/Shanghai'
});
五、部署与监控
5.1 使用 PM2 部署
安装 PM2 进程管理工具:
npm install -g pm2
创建 PM2 配置文件 ecosystem.config.js:
module.exports = {
apps: [{
name: 'oracle-cron-jobs',
script: 'backupJob.js',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production'
}
}]
};
启动应用:
pm2 start ecosystem.config.js
5.2 任务监控
通过 PM2 监控应用运行状态:
pm2 monit
pm2 logs oracle-cron-jobs
六、总结与展望
本文介绍了如何使用 node-cron 实现 Oracle 数据库的定时任务,包括基础使用、连接数据库、实现企业级特性(重试机制、日志记录、错误通知)以及部署监控。通过这些技术,可以构建可靠、可维护的企业级定时任务系统。
未来可以进一步探索以下方向:
- 任务调度可视化界面
- 分布式任务调度
- 任务依赖管理
官方文档:README.md 任务调度核心代码:src/job.ts 示例代码:examples/
希望本文对你构建企业级定时任务系统有所帮助!如果有任何问题或建议,欢迎在评论区留言。
【免费下载链接】node-cron Cron for NodeJS. 项目地址: https://gitcode.com/gh_mirrors/no/node-cron
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



