//Обработка новых заказов, самый фарш тут public async Task Invoke() { //Ищем новые заказы var status = _context.Processings .AsNoTracking() .Where(p => p.Status == "new") .ToList(); if (status.Count > 0) { //вытаскиваем словарь с системой и методом который должен быть вызван Process process = new Process(_context); Type type = typeof(Process); var dictionary = _context.Choices .AsNoTracking() .ToDictionary(c => c.Key, c => c.Value); //Находим в таблице ордеров записи по вытащенным идшникам foreach (var processing in status) { var item = _context.Orders.AsNoTracking().FirstOrDefault(o => o.Id == processing.OrderId); //Для каждой итерации смотрим название метода в словаре по ключу //через рефлексию находим метод и вызываем его для каждой системы собственный var method = dictionary.FirstOrDefault(d => d.Key == item.SystemType); MethodInfo info = type.GetMethod(method.Value); try { //Вызываем найденный метод с json var obj = info?.Invoke(process, new object[] { item.SourceOrder }); string json = (string)obj; item.ConvertedOrder = json; processing.Status = StatusOrder.Finish; _context.Orders.Update(item); _context.Processings.Update(processing); } catch (Exception ex) { //Делаем гарантированный запуск задачи в новом //потоке чтобы не прерывал обработку заказов //и передаем управление новой итерации new Thread(async() => await ErrorService.AlarmaAhtungWarningErrorMethodAsync(ex.Message)).Start(); continue; } } await _context.SaveChangesAsync(); } }
public string UberHandlerMethod(string json) { try { throw new JsonException("Упс, ошибочка вышла в uber"); } catch (Exception ex) { new Thread(async() => await ErrorService.AlarmaAhtungWarningErrorMethodAsync($"{ex.Message}")).Start(); //Будем считать что обработка прошла успешно и возвращаем //исходный json который будет сохранен в столбце как обработанный //Ибо, раз обработка этого типа заказа заключается в выбрасывании исключения, //значит можно считать что она проделана return(json); } }