public async Task <IDTOperationRecordPollingRollbackController> Execute(string storeGroupName, string memberName) { //获取存储组 var storeGroup = await _storeGroupRepositoryCacheProxy.QueryByName(storeGroupName); if (storeGroup == null) { var fragment = new TextFragment() { Code = TextCodes.NotFounStoreGroupMemberByName, DefaultFormatting = "找不到名称为{0}的存储组", ReplaceParameters = new List <object>() { storeGroupName } }; throw new UtilityException((int)Errors.NotFounStoreGroupByName, fragment); } //获取指定的组成员 var groupMember = await storeGroup.GetMember(memberName); if (groupMember == null) { var fragment = new TextFragment() { Code = TextCodes.NotFoundStoreGroupMemberInGroup, DefaultFormatting = "在名称为{0}的存储组下找不到名称为{1}的成员", ReplaceParameters = new List <object>() { storeGroupName, memberName } }; throw new UtilityException((int)Errors.NotFoundStoreGroupMemberInGroup, fragment); } var pollingResult = await PollingHelper.Polling <DTOperationRecord>( async() => { await Task.CompletedTask; return (new AsyncInteration <DTOperationRecord> ( async(index) => { if (index == 0) { while (true) { var completeList = await _dtOperationRecordRepository.QueryBySkip(groupMember.StoreInfo, (int)DTOperationRecordStatus.Complete, 0, 500); await ParallelHelper.ForEach(completeList, 5, async(record) => { await record.Delete(); } ); if (completeList.Count < 500) { break; } } } var datas = await _dtOperationRecordRepository.QueryBySkip(groupMember.StoreInfo, (int)DTOperationRecordStatus.UnComplete, index * 500, 500); return datas; } )); }, 5, 500, async(record) => { try { using (var diContainer = DIContainerContainer.CreateContainer()) { var orginialDI = ContextContainer.GetValue <IDIContainer>("DI"); try { ContextContainer.SetValue <IDIContainer>("DI", diContainer); if (await record.NeedCancel()) { await record.Cancel(); } } finally { ContextContainer.SetValue <IDIContainer>("DI", orginialDI); } } } catch (Exception ex) { Exception rootEx = ex; while (ex.InnerException != null) { ex = ex.InnerException; } if (ex != rootEx) { await record.UpdateErrorMessage($"root message:{rootEx.Message},inner message:{ex.Message},root Stack:{rootEx.StackTrace},inner Stack:{ex.StackTrace}"); } else { await record.UpdateErrorMessage($"message:{rootEx.Message},Stack:{rootEx.StackTrace}"); } } }, null, async(ex) => { LoggerHelper.LogError(ErrorLoggerCategoryName, $"DTOperationRecordPollingRollbackService Execute Error,ErrorMessage:{ex.Message},StackTrace:{ex.StackTrace}"); } ); DTOperationRecordPollingRollbackControllerDefault controller = new DTOperationRecordPollingRollbackControllerDefault(pollingResult); return(controller); }
async static Task Main(string[] args) { AsyncInteration <string> asyncInteration = new AsyncInteration <string>( async(index) => { if (index <= 3) { //模拟数据源 return(await Task.FromResult(new List <string>() { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "A", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() })); } return(null); } ); var pollingResult = await PollingHelper.Polling <string>( async() => { return(await Task.FromResult( new AsyncInteration <string>( async(index) => { if (index <= 3) { //模拟数据源 return await Task.FromResult(new List <string>() { Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "A", Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString() }); } return null; } ) )); }, 3, 1000, async (data) => { //模拟耗时操作 await Task.Delay(100); Console.WriteLine(data); } , async(ex) => { Console.WriteLine(ex.ToString()); await Task.CompletedTask; } ); //10秒后,关闭轮询 await Task.Delay(10000); await pollingResult.Stop(); Console.ReadLine(); /*await ParallelHelper.ForEach(asyncInteration, 3, async (data) => * { * //模拟耗时操作 * await Task.Delay(300); * * Console.WriteLine(data); * });*/ //初始化 //Init(); //await LocalTimeout(); //await LocalVersion(); //await Combination(); }
/// <summary> /// 执行所有关联的队列 /// </summary> /// <param name="group"></param> /// <returns></returns> public async Task <ISQueueProcessGroupExecuteResult> Execute(SQueueProcessGroup group) { bool errorLogRecord = false; //声明一个轮询配置列表,队列的执行通过轮询处理帮助器管理,保证只有一个主控线程被占用 List <PollingConfiguration> pollingConfigurations = new List <PollingConfiguration>(); await GetAllQueue(group, async (queue) => { pollingConfigurations.Add(new PollingConfiguration() { Action = async() => { try { if (AdministratorClaimGeneratorName != null && AdministratorClaimContextGeneratorName != null) { //生成上下文 var administratorClaimGenerator = await _environmentClaimGeneratorRepository.QueryByName(AdministratorClaimGeneratorName); if (administratorClaimGenerator == null) { var fragment = new TextFragment() { Code = TextCodes.NotFoundEnvironmentClaimGeneratorByName, DefaultFormatting = "没有找到名称为{0}的环境声明生成器", ReplaceParameters = new List <object>() { AdministratorClaimGeneratorName } }; throw new UtilityException((int)Errors.NotFoundEnvironmentClaimGeneratorByName, fragment); } var claims = await administratorClaimGenerator.Generate(); var administratorClaimContextGenerator = await _claimContextGeneratorRepository.QueryByName(AdministratorClaimContextGeneratorName); if (administratorClaimContextGenerator == null) { var fragment = new TextFragment() { Code = TextCodes.NotFoundClaimContextGeneratorByName, DefaultFormatting = "没有找到名称为{0}的上下文生成器", ReplaceParameters = new List <object>() { AdministratorClaimContextGeneratorName } }; throw new UtilityException((int)Errors.NotFoundClaimContextGeneratorByName, fragment); } administratorClaimContextGenerator.ContextInit(claims.Claims); } ConcurrentDictionary <Guid, Guid> errorMessageList = new ConcurrentDictionary <Guid, Guid>(); //获取队列中的消息 await _smessageRepository.QueryAllByQueue(queue, 500, async(messages) => { bool needRestart = false; foreach (var message in messages) { StatusResult executeResult = new StatusResult() { Status = 2 }; try { using (var diContainer = DIContainerContainer.CreateContainer()) { var orginialDI = ContextContainer.GetValue <IDIContainer>("DI"); try { ContextContainer.SetValue <IDIContainer>("DI", diContainer); //对每个消息执行处理 executeResult = await message.Execute(); } finally { ContextContainer.SetValue <IDIContainer>("DI", orginialDI); } } } catch (Exception ex) { while (ex.InnerException != null) { ex = ex.InnerException; } //if (errorMessageList.Count<=100000) //{ //if (!errorMessageList.ContainsKey(message.ID)) //{ // errorMessageList.TryAdd(message.ID, message.ID); LoggerHelper.LogError(ErrorLoggerCategoryName, $"SQueueProcessGroup {group.Name} Execute Error,message Type {message.Type},message id {message.ID.ToString()},ErrorMessage:{await ex.GetCurrentLcidMessage()},StackTrace:{ex.StackTrace}"); //} //} } if (executeResult.Status == 0) { //执行成功 needRestart = true; await message.Delete(); //errorMessageList.TryRemove(message.ID, out Guid deleteId); } else { if (executeResult.Status == 3) { needRestart = true; //执行失败 //LoggerHelper.LogError(ErrorLoggerCategoryName, $"SQueueProcessGroup Message Execute Error,Type:{message.Type},Key:{message.Key},Data:{message.Data},ErrorMessage:{executeResult.Description}"); } } } if (needRestart) { return(await Task.FromResult(false)); } else { return(await Task.FromResult(true)); } }); //System.Threading.Thread.Sleep(1000); } catch (Exception ex) { //if (!errorLogRecord) //{ while (ex.InnerException != null) { ex = ex.InnerException; } LoggerHelper.LogError(ErrorLoggerCategoryName, $"SQueueProcessGroup {group.Name} Execute Error,ErrorMessage:{await ex.GetCurrentLcidMessage()},StackTrace:{ex.StackTrace}"); // errorLogRecord = true; //} await Task.Delay(1000 * 60 * 2); } }, Interval = queue.Interval } ); await Task.FromResult(0); }); var pollingResult = PollingHelper.Polling(pollingConfigurations, async(ex) => { LoggerHelper.LogError(ErrorLoggerCategoryName, $"PollingHelper Execute Error,ErrorMessage:{ex.Message},StackTrace:{ex.StackTrace}"); } ); return(new SQueueProcessGroupExecuteResultDefalut(pollingResult)); }