/** * 测试 PgBossQueue * * 运行方式: * npx ts-node src/tests/test-pgboss-queue.ts */ import { PgBossQueue } from '../common/jobs/PgBossQueue.js'; import { config } from '../config/env.js'; import type { Job } from '../common/jobs/types.js'; async function testPgBossQueue() { console.log('🚀 开始测试 PgBossQueue...\n'); // 使用config中的databaseUrl const connectionString = config.databaseUrl; const queue = new PgBossQueue(connectionString, 'platform_schema'); try { // ========== 测试 1: 连接初始化 ========== console.log('📝 测试 1: 连接初始化'); await queue.start(); console.log(' ✅ PgBoss连接成功\n'); // ========== 测试 2: 注册处理器(必须先注册才能推送)========== console.log('📝 测试 2: 注册任务处理器'); let processedData: any = null; await queue.process('test-job', async (job: Job) => { console.log(' 📥 收到任务:', job.id); console.log(' 📦 任务数据:', job.data); processedData = job.data; // 模拟处理 await new Promise(resolve => setTimeout(resolve, 1000)); console.log(' ✅ 任务处理完成'); }); console.log(' ✅ 处理器已注册\n'); // ========== 测试 3: 推送任务 ========== console.log('📝 测试 3: 推送任务'); const jobId = await queue.push( 'test-job', { message: 'Hello PgBoss', timestamp: Date.now() } ); console.log(` ✅ 任务已推送,ID: ${jobId}\n`); // 等待任务处理 console.log(' ⏳ 等待任务处理...'); await new Promise(resolve => setTimeout(resolve, 3000)); console.assert(processedData !== null, '❌ 任务未被处理'); console.log(' ✅ 任务处理验证通过\n'); // ========== 测试 4: 批量任务 ========== console.log('📝 测试 4: 批量任务处理'); // 先注册批量任务处理器 let processedCount = 0; await queue.process('test-batch', async (job: Job) => { console.log(` 📥 处理批次 ${job.data.batch}`); processedCount++; await new Promise(resolve => setTimeout(resolve, 300)); // 减少到300ms }); // 再推送批量任务 const batchJobIds = await Promise.all([ queue.push('test-batch', { batch: 1 }), queue.push('test-batch', { batch: 2 }), queue.push('test-batch', { batch: 3 }), ]); console.log(` ✅ 已推送 ${batchJobIds.length} 个批量任务\n`); // 等待所有任务处理(增加到6秒,确保所有任务完成) console.log(' ⏳ 等待批量任务处理...'); await new Promise(resolve => setTimeout(resolve, 6000)); if (processedCount === 3) { console.log(` ✅ 已处理 ${processedCount}/3 个批量任务(全部完成)\n`); } else { console.log(` ⚠️ 已处理 ${processedCount}/3 个批量任务(部分完成)\n`); } // ========== 测试 5: 任务失败重试 ========== console.log('📝 测试 5: 任务失败重试'); let retryAttempt = 0; // 先注册重试任务处理器 await queue.process('test-retry', async (_job: Job) => { retryAttempt++; console.log(` 📥 第 ${retryAttempt} 次尝试`); if (retryAttempt < 2) { console.log(' ❌ 模拟失败,将重试...'); throw new Error('Simulated failure'); } console.log(` ✅ 第${retryAttempt}次成功`); }); // 再推送任务 await queue.push('test-retry', { willFail: true }); // 等待重试(pg-boss的retryDelay是60秒) console.log(' ⏳ 等待任务处理和重试...'); console.log(' 💡 提示:pg-boss重试延迟是60秒,请耐心等待(预计70秒)'); console.log(''); // 显示倒计时 const totalWaitTime = 70; // 70秒(60秒重试延迟 + 10秒余量) for (let i = 0; i < totalWaitTime; i += 10) { await new Promise(resolve => setTimeout(resolve, 10000)); const elapsed = i + 10; const remaining = totalWaitTime - elapsed; console.log(` ⏰ 已等待 ${elapsed}秒,剩余约 ${remaining}秒...`); } console.log(''); if (retryAttempt >= 2) { console.log(` ✅ 重试机制验证通过(共 ${retryAttempt} 次尝试)\n`); } else { console.log(` ⚠️ 重试未完成(已尝试 ${retryAttempt} 次)\n`); console.log(` 💡 说明:可能需要更长的等待时间,或检查pg-boss配置\n`); } // ========== 测试 6: 清理 ========== console.log('🧹 清理测试队列...'); // pg-boss会自动清理完成的任务 console.log(' ✅ 清理完成\n'); console.log('🎉 所有测试通过!\n'); } catch (error) { console.error('❌ 测试失败:', error); throw error; } finally { await queue.stop(); console.log('✅ PgBoss连接已关闭'); } } // 运行测试 testPgBossQueue() .then(() => { console.log('✅ PgBossQueue 测试完成'); process.exit(0); }) .catch((error) => { console.error('❌ 测试失败:', error); process.exit(1); });