Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
125 lines
2.8 KiB
Go
125 lines
2.8 KiB
Go
package job
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/dataReport"
|
|
"videoweb/pub/models/eventmod"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
var isRuining = false
|
|
|
|
const (
|
|
maxRetryCount = 10 // 最大重试次数
|
|
maxReportNum = 100 // 最大上报数
|
|
)
|
|
|
|
func Report() {
|
|
//防止重入
|
|
if isRuining {
|
|
return
|
|
}
|
|
isRuining = true
|
|
defer func() {
|
|
isRuining = false
|
|
}()
|
|
ctx := context.Background()
|
|
opts := options.Find()
|
|
opts = opts.SetSort(bson.D{{Key: "_id", Value: 1}}).SetLimit(1000)
|
|
// 查询出一千条记录批量上传
|
|
list, stdErr := eventmod.FindManyEvent(ctx, bson.M{
|
|
"$or": []bson.M{
|
|
bson.M{
|
|
"status": eventmod.Default,
|
|
},
|
|
bson.M{
|
|
"status": eventmod.Failure,
|
|
"retryCount": bson.M{"$lte": maxRetryCount},
|
|
},
|
|
},
|
|
}, opts)
|
|
if stdErr != nil {
|
|
log.Error("Get event list error", log.E(stdErr))
|
|
return
|
|
}
|
|
if len(list) == 0 {
|
|
return
|
|
}
|
|
var eventList []*dataReport.CommonField
|
|
for _, v := range list {
|
|
event := &dataReport.CommonField{}
|
|
err := json.Unmarshal([]byte(v.Data), &event)
|
|
if err != nil {
|
|
log.Error("event report json.Unmarshal fail", log.Any("eventData", v.Data), log.E(err))
|
|
continue
|
|
}
|
|
eventList = append(eventList, event)
|
|
if len(eventList) < maxReportNum {
|
|
continue
|
|
}
|
|
// 批量上报
|
|
err = dataReport.BatchReport(ctx, eventList)
|
|
if err != nil {
|
|
log.Error("Batch report error", log.E(err))
|
|
// 将这些设置为失败
|
|
onReportEventFail(ctx, eventList)
|
|
} else {
|
|
onReportEventSuccess(ctx, eventList)
|
|
}
|
|
eventList = []*dataReport.CommonField{} // 重新变成0个
|
|
}
|
|
|
|
// 将剩余的批量上报
|
|
err := dataReport.BatchReport(ctx, eventList)
|
|
if err != nil {
|
|
log.Error("Batch report error", log.E(err))
|
|
// 将这些设置为失败
|
|
onReportEventFail(ctx, eventList)
|
|
} else {
|
|
onReportEventSuccess(ctx, eventList)
|
|
}
|
|
}
|
|
|
|
func onReportEventSuccess(ctx context.Context, eventList []*dataReport.CommonField) {
|
|
eventIds := []string{}
|
|
for _, v := range eventList {
|
|
eventIds = append(eventIds, v.EventID)
|
|
}
|
|
if len(eventIds) == 0 {
|
|
return
|
|
}
|
|
err := eventmod.UpdateManyEvent(ctx, bson.M{
|
|
"eventId": bson.M{"$in": eventIds},
|
|
}, bson.M{
|
|
"$set": bson.M{"status": eventmod.Success},
|
|
})
|
|
if err != nil {
|
|
log.Error("Update event fail", log.E(err))
|
|
return
|
|
}
|
|
}
|
|
|
|
func onReportEventFail(ctx context.Context, eventList []*dataReport.CommonField) {
|
|
eventIds := []string{}
|
|
for _, v := range eventList {
|
|
eventIds = append(eventIds, v.EventID)
|
|
}
|
|
if len(eventIds) == 0 {
|
|
return
|
|
}
|
|
err := eventmod.UpdateManyEvent(ctx, bson.M{
|
|
"eventId": bson.M{"$in": eventIds},
|
|
}, bson.M{
|
|
"$set": bson.M{"status": eventmod.Failure},
|
|
"$inc": bson.M{"retryCount": 1},
|
|
})
|
|
if err != nil {
|
|
log.Error("Update event fail", log.E(err))
|
|
return
|
|
}
|
|
}
|