Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.89 KB | None | 0 0
  1. using GAMongo.Core.Domain.Logging;
  2. using GAMongo.Core.Domain.Tasks;
  3. using GAMongo.Services.Logging;
  4. using System;
  5. using GAMongo.Core.Data;
  6. using MongoDB.Driver.Linq;
  7. using MongoDB.Driver;
  8. using System.Collections.Generic;
  9. using System.Threading.Tasks;
  10. using System.Linq;
  11. using GAMongo.Data;
  12.  
  13. namespace GAMongo.Services.Tasks
  14. {
  15.     public partial class UpdateOrdersTask : ScheduleTask, IScheduleTask
  16.     {
  17.         private readonly ILogger _logger;
  18.         private readonly IRepository<Core.Domain.Orders.Order> _orderRepository;
  19.         private readonly DataSettingsManager _dataSettingsManager;
  20.  
  21.         public UpdateOrdersTask(IRepository<Core.Domain.Orders.Order> orderRepository,
  22.                                               ILogger logger)
  23.         {
  24.             this._orderRepository = orderRepository;
  25.             this._dataSettingsManager = new DataSettingsManager();
  26.             this._logger = logger;
  27.         }
  28.  
  29.         public void Execute()
  30.         {
  31.             int procCount = Environment.ProcessorCount;
  32.             var orders = _orderRepository.Table.Where(p => p.OrderType != Core.Domain.Orders.OrderType.Offline).ToList();
  33.             if(orders.Count < procCount*100)
  34.             {
  35.                 //Обработка в одном потоке
  36.                 try
  37.                 {
  38.                     InsertLog(OrderTypeUpdate(orders, _orderRepository));
  39.                 }
  40.                 catch(Exception ex)
  41.                 {
  42.                     InsertLog(errors: new List<string>() { ex.Message });
  43.                 }                
  44.             }
  45.             else
  46.             {
  47.                 //Мультипоточная обработка
  48.                 var dataProviderSettings = _dataSettingsManager.LoadSettings();
  49.                 int cntPartListOrder = orders.Count / procCount;
  50.                 List<Task<int>> tasks = new List<Task<int>>();
  51.                 List<string> errors = new List<string>();
  52.  
  53.                 for (var a = 0; a < procCount; a++)
  54.                 {
  55.                     int i = a;
  56.                     tasks.Add(Task.Run(() => OrderTypeUpdate(orders.GetRange(cntPartListOrder * i, (i == procCount - 1 && orders.Count % 2 != 0) ? cntPartListOrder + 1 : cntPartListOrder),
  57.                         new MongoDBRepository<Core.Domain.Orders.Order>(dataProviderSettings.DataConnectionString))));
  58.                 }
  59.  
  60.                 try
  61.                 {
  62.                     Task.WaitAll(tasks.ToArray());
  63.                 }
  64.                 catch (AggregateException ae)
  65.                 {
  66.                     foreach (var e in ae.Flatten().InnerExceptions)
  67.                     {
  68.                         errors.Add(e.Message);
  69.                     }
  70.                 }
  71.  
  72.                 var cnt = tasks.Where(p => p.Status != TaskStatus.Faulted).Select(p => p.Result).Sum();
  73.                 InsertLog(cnt, errors);
  74.             }                      
  75.         }
  76.  
  77.         private int OrderTypeUpdate(List<Core.Domain.Orders.Order> orders, IRepository<Core.Domain.Orders.Order> repository)
  78.         {            
  79.             orders.ForEach(o => {
  80.                 o.StoreId = "125";
  81.                 o.OrderType = Core.Domain.Orders.OrderType.Online;
  82.             });
  83.             repository.Update(orders);
  84.             return orders.Count;        
  85.         }
  86.  
  87.         protected void InsertLog(int counter = 0, List<string> errors = null)
  88.         {
  89.             string log = (errors?.Count > 0) ? "Checks and Updates Associated with a field OrderType (orders) : Error during execute. Updated " + counter + " records."
  90.                 : "Checks and Updates Associated with a field OrderType (orders) : Successfully completed. Updated " + counter + " records.";
  91.                        
  92.             _logger.InsertLog((errors?.Count > 0 ? LogLevel.Error : LogLevel.Information), log, errors?.Count > 0 ? String.Join(",", errors.ToArray()) : null);
  93.         }
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement