feat(msgManager): 消息推送失败增加重发机制

This commit is contained in:
huzhengrong 2025-10-24 17:39:14 +08:00
parent 1c33eed181
commit 180e43d729
1 changed files with 46 additions and 7 deletions

View File

@ -29,6 +29,9 @@ class MessageQueue extends EventEmitter {
// 启动处理器
this.startProcessor();
// 启动失败消息重试机制
this.startFailedMessageRetry();
}
// 添加消息到队列
@ -88,6 +91,9 @@ class MessageQueue extends EventEmitter {
this.processing = true;
let msgMap = {};
// 用于跟踪消息是否是重试的
let isRetryMap = {};
for (const message of pendingMessages) {
try {
console.log(`📧 处理消息: ${message.spider_name}`);
@ -95,10 +101,14 @@ class MessageQueue extends EventEmitter {
// let formdata = JSON.parse(message.data);
if (!msgMap[message.spider_name]) {
msgMap[message.spider_name] = message.data;
isRetryMap[message.spider_name] = message.status === 'failed';
} else {
msgMap[message.spider_name].push(...message.data);
}
// 只有当消息不是重试消息时才更新状态为sent
// 如果是重试消息且成功发送,则删除错误信息
if (message.status !== 'failed') {
message.status = "sent";
message.sent_at = new Date().toISOString();
this.queue.updateMessageStatus(
@ -106,6 +116,17 @@ class MessageQueue extends EventEmitter {
message.status,
message.sent_at
);
} else {
// 重试成功,清除错误信息
message.status = "sent";
message.sent_at = new Date().toISOString();
this.queue.updateMessageStatus(
message.id,
message.status,
message.sent_at,
null // 清除错误信息
);
}
} catch (error) {
console.error(`❌ 消息处理失败: ${message.id}`, error);
message.status = "failed";
@ -162,6 +183,24 @@ class MessageQueue extends EventEmitter {
sign = sign.toUpperCase();
return sign;
}
// 启动失败消息重试机制
startFailedMessageRetry() {
// 每5分钟检查一次失败的消息并重试
setInterval(async () => {
try {
console.log("检查失败消息并重试...");
const failedMessages = this.queue.getFailedMessages();
if (failedMessages.length > 0) {
console.log(`发现 ${failedMessages.length} 条失败消息,尝试重试发送...`);
// 重新处理失败的消息
await this.processQueue(failedMessages);
}
} catch (error) {
console.error(`❌ 失败消息重试失败:`, error);
}
}, 5 * 60 * 1000); // 每5分钟检查一次
}
}
const messageQueue = new MessageQueue();