Ejemplo n.º 1
0
        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);
                    }
                }
            }
        }