protected override void UpdateList(List <TWriteObject> writeObjects) { const int batchCount = 100; //todo var accountGroups = writeObjects.GroupBy(x => x.AccountId); foreach (var accountGroup in accountGroups) { var accountId = accountGroup.Key; // получим пачки var batchGroups = accountGroup .OrderBy(x => x.SaveOrder) .Select((x, index) => new { Batch = index / batchCount, WriteObject = x }) .GroupBy(x => x.Batch); foreach (var batchGroup in batchGroups) { var batchItems = batchGroup.ToList(); // сохраним пачку var batch = batchItems .Select(x => x.WriteObject) .ToList(); // делаем N попыток int attemps = 0; bool useCheck = false; while (true) { attemps++; try { UpdateBatch(accountId, batch, useCheck); _updateDataBaseCount += batch.Count; // отправим событие var saveEvent = ComponentControl.CreateComponentEvent("UpdateBatch"); saveEvent.SetImportance(Zidium.Api.EventImportance.Success); saveEvent.SetJoinInterval(TimeSpan.FromMinutes(1)); saveEvent.Add(); break; } catch (Exception exception) { // отправим событие var errorEvent = ComponentControl.CreateApplicationError("UpdateBatchError", exception); errorEvent.SetImportance(Zidium.Api.EventImportance.Alarm); errorEvent.SetJoinInterval(TimeSpan.FromMinutes(1)); errorEvent.Add(); useCheck = true; if (attemps >= 50) { throw; } ComponentControl.Log.Error("Ошибка UpdateBatch. Попытка " + attemps, exception); Thread.Sleep(TimeSpan.FromSeconds(10)); } } Interlocked.Increment(ref UpdateBatchCount); // обновим статистику foreach (var batchItem in batch) { SetResponseSaved(batchItem); } } } }
protected override void AddList(List <TWriteObject> writeObjects) { var accountGroups = writeObjects.GroupBy(x => x.AccountId); foreach (var accountGroup in accountGroups) { var accountId = accountGroup.Key; int batchCount = 100; // получим пачки var batchGroups = accountGroup .OrderBy(x => x.SaveOrder) .Select((x, index) => new { Batch = index / batchCount, WriteObject = x }) .GroupBy(x => x.Batch); foreach (var batchGroup in batchGroups) { var batchItems = batchGroup.ToList(); var batch = batchItems .Select(x => x.WriteObject) .ToList(); // делаем N попыток int attemps = 0; bool chackAdd = false; // не проверять сущществование объектов перед вставкой while (true) { attemps++; try { AddBatch(accountId, batch, chackAdd); _addDataBaseCount += batch.Count; // отправим событие var saveEvent = ComponentControl.CreateComponentEvent("AddBatch"); saveEvent.SetImportance(EventImportance.Success); saveEvent.SetJoinInterval(TimeSpan.FromMinutes(1)); saveEvent.Add(); break; } catch (Exception exception) { // отправим событие var errorEvent = ComponentControl.CreateApplicationError("AddBatchError", exception); errorEvent.SetImportance(EventImportance.Alarm); errorEvent.SetJoinInterval(TimeSpan.FromMinutes(1)); errorEvent.Add(); if (attemps >= 100) { throw; } chackAdd = true; ComponentControl.Log.Error("Ошибка AddBatch. Попытка " + attemps, exception); Thread.Sleep(TimeSpan.FromSeconds(10)); } } Interlocked.Increment(ref AddBatchCount); // обновим статистику foreach (var batchItem in batch) { SetResponseSaved(batchItem); } } } }