forked from lunanting/cangku
85 lines
2.5 KiB
JavaScript
85 lines
2.5 KiB
JavaScript
'use strict';
|
||
|
||
const path = require('path');
|
||
const cron = require('node-cron');
|
||
|
||
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
|
||
|
||
const cloudDb = require('../src/config/cloudDatabase');
|
||
const planningDb = require('../src/services/planningDatabase');
|
||
const { syncJstReferenceTables } = require('../src/services/planningJstReferenceSync');
|
||
|
||
const TIMEZONE = process.env.JST_REFERENCE_SYNC_TIMEZONE || 'Asia/Shanghai';
|
||
const CRON_EXPRESSION = process.env.JST_REFERENCE_SYNC_CRON || '0 22 * * *';
|
||
const CHUNK_SIZE = Number.parseInt(process.env.JST_REFERENCE_SYNC_CHUNK_SIZE || '500', 10) || 500;
|
||
const LOOKBACK_MINUTES = Number.parseInt(process.env.JST_REFERENCE_SYNC_LOOKBACK_MINUTES || '10', 10) || 10;
|
||
|
||
let isRunning = false;
|
||
|
||
async function closePools() {
|
||
await Promise.allSettled([
|
||
cloudDb.close(),
|
||
planningDb.close(),
|
||
]);
|
||
}
|
||
|
||
async function runSync(reason) {
|
||
if (isRunning) {
|
||
console.log(`[jst-reference-sync-scheduler] 跳过 ${reason},上一轮同步仍在运行`);
|
||
return;
|
||
}
|
||
|
||
isRunning = true;
|
||
const startedAt = new Date();
|
||
console.log(`[jst-reference-sync-scheduler] ${reason} 开始`, startedAt.toISOString());
|
||
|
||
try {
|
||
const result = await syncJstReferenceTables({
|
||
table: 'all',
|
||
full: false,
|
||
chunkSize: CHUNK_SIZE,
|
||
lookbackMinutes: LOOKBACK_MINUTES,
|
||
onProgress: (payload) => {
|
||
console.log(
|
||
`[jst-reference-sync-scheduler] ${payload.table} ${payload.fetchedRows}/${payload.totalRows}`
|
||
);
|
||
},
|
||
});
|
||
console.log('[jst-reference-sync-scheduler] 同步完成', JSON.stringify(result));
|
||
} catch (error) {
|
||
console.error('[jst-reference-sync-scheduler] 同步失败:', error);
|
||
} finally {
|
||
await closePools();
|
||
isRunning = false;
|
||
console.log(
|
||
`[jst-reference-sync-scheduler] ${reason} 结束,用时 ${Date.now() - startedAt.getTime()}ms`
|
||
);
|
||
}
|
||
}
|
||
|
||
cron.schedule(CRON_EXPRESSION, () => {
|
||
runSync('每日22点增量同步');
|
||
}, {
|
||
timezone: TIMEZONE,
|
||
});
|
||
|
||
setTimeout(() => {
|
||
runSync('进程启动增量同步');
|
||
}, 1000);
|
||
|
||
process.on('SIGINT', async () => {
|
||
console.log('[jst-reference-sync-scheduler] 收到 SIGINT,准备退出');
|
||
await closePools();
|
||
process.exit(0);
|
||
});
|
||
|
||
process.on('SIGTERM', async () => {
|
||
console.log('[jst-reference-sync-scheduler] 收到 SIGTERM,准备退出');
|
||
await closePools();
|
||
process.exit(0);
|
||
});
|
||
|
||
console.log(
|
||
`[jst-reference-sync-scheduler] 已启动,计划 ${CRON_EXPRESSION},时区 ${TIMEZONE}`
|
||
);
|