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 } }