public bool AddTask(string target) { if (!Tasks.ContainsKey(target)) { try { var host = ScanHosts.OrderBy(h => h.WaitTaskCount).First(); TaskUnit taskUnit = new TaskUnit(host.Host, host.Port); if (taskUnit.NewTask(target)) { Tasks.Add(target, taskUnit); host.WaitTaskCount += 1; OnMessageNotify($"成功添加目标[{target}]到执行主机[{host.Host}:{host.Port}]", MessageNotifyTypes.AddTask, taskUnit); } else { OnMessageNotify($"添加目标[{target}]到执行主机[{host.Host}:{host.Port}]失败!", MessageNotifyTypes.AddTaskFailed, taskUnit); } } catch (Exception e) { OnMessageNotify($"添加目标[{target}]失败:{e.Message}", MessageNotifyTypes.AddTaskFailed); return(false); } } else { OnMessageNotify($"目标[{target}]任务已添加,无需重复添加.", MessageNotifyTypes.Info); } return(true); }
void Start(bool allowRestart, CancellationToken token) { try { while (true) { foreach (var target in Tasks.Keys) { token.ThrowIfCancellationRequested(); if (Tasks[target].Status != RunningStatus.Waiting) { continue; } try { var host = ScanHosts.FirstOrDefault(h => h.Host == Tasks[target].ScanServerHost && h.Port == Tasks[target].ScanServerPort); if (host.RunningTaskCount >= MaxHostThreads) { continue; } if (Tasks[target].StartGetDBTableColumnCount()) { host.RunningTaskCount += 1; OnMessageNotify($"启动任务{target}成功!", MessageNotifyTypes.TaskStarted, Tasks[target]); } else { OnMessageNotify($"启动任务{target}失败!", MessageNotifyTypes.TaskFailed, Tasks[target]); } } catch (Exception e) { OnMessageNotify($"启动任务{target}失败:{e.Message}", MessageNotifyTypes.Info); } } //检查是否完成 foreach (var target in Tasks.Keys) { token.ThrowIfCancellationRequested(); if (!Tasks[target].CheckTaskFinied() || CompleteTasks.ContainsKey(target)) { continue; } try { var data = Tasks[target].GetTaskData(); Tasks[target].ReadAllFromTaskData(data); var host = ScanHosts.FirstOrDefault(h => h.Host == Tasks[target].ScanServerHost && h.Port == Tasks[target].ScanServerPort); host.RunningTaskCount -= 1; CompleteTasks.Add(target, Tasks[target]); OnMessageNotify($"任务{target}执行完成.", MessageNotifyTypes.TaskFinished, Tasks[target]); } catch (Exception e) { OnMessageNotify($"检查任务结果{target}失败:{e.Message}", MessageNotifyTypes.TaskFailed, Tasks[target]); } } foreach (var target in CompleteTasks.Keys) { var targetUnit = CompleteTasks[target]; foreach (var dbName in targetUnit.TargetInfo.Databases.Keys) { var db = targetUnit.TargetInfo.Databases[dbName]; foreach (var tableName in db.Tables.Keys) { if (string.IsNullOrEmpty(targetUnit.CurrentTickTable)) { targetUnit.CurrentTickTable = $"{dbName}.{tableName}"; } if (targetUnit.CurrentTickTable != $"{dbName}.{tableName}") { continue; } var table = db.Tables[tableName]; switch (table.Status) { case TableProcessingTypes.Waiting: if (targetUnit.StartRunSql(table.GetSqlExampleDataStart(dbName))) { table.Status = TableProcessingTypes.LoadingExampleDataStart; } break; case TableProcessingTypes.LoadingExampleDataStart: if (targetUnit.CheckTaskFinied()) { try { var data = targetUnit.GetTaskData(); var startDatas = targetUnit.ReadExampeData(data); table.StartExampleDatas = startDatas; table.Status = TableProcessingTypes.LoadExampleDataStartFinished; } catch (Exception ex) { table.Status = TableProcessingTypes.LoadExampleDataEndFinished; OnMessageNotify($"目标{targetUnit.Target}对表{dbName}.{tableName}获取前N条抽样数据失败.", MessageNotifyTypes.Info); } } break; case TableProcessingTypes.LoadExampleDataStartFinished: if (targetUnit.StartRunSql(table.GetSqlExampleDataEnd(dbName))) { table.Status = TableProcessingTypes.LoadingExampleDataEnd; } break; case TableProcessingTypes.LoadingExampleDataEnd: if (targetUnit.CheckTaskFinied()) { try { var data = targetUnit.GetTaskData(); var endDatas = targetUnit.ReadExampeData(data); table.EndExampleDatas = endDatas; table.Status = TableProcessingTypes.LoadExampleDataEndFinished; } catch (Exception ex) { table.Status = TableProcessingTypes.LoadExampleDataEndFinished; OnMessageNotify($"目标{targetUnit.Target}对表{dbName}.{tableName}获取后N条抽样数据失败.", MessageNotifyTypes.Info); } } break; case TableProcessingTypes.LoadExampleDataEndFinished: OnMessageNotify($"目标{targetUnit.Target}对表{dbName}.{tableName}获取抽样数据完成.", MessageNotifyTypes.Info); //仅采样数据 targetUnit.CurrentTickTable = null; break; //if (table.CanDirectDumpAll) //{ // if (targetUnit.StartDumpTable(dbName,tableName)) // { // table.Status = TableProcessingTypes.DumpingData; // OnMessageNotify($"目标{targetUnit.Target}对表{dbName}.{tableName}开始下载数据...", MessageNotifyTypes.Info); // } //} //else //{ // targetUnit.CurrentTickTable = null; //} //break; case TableProcessingTypes.DumpingData: if (targetUnit.CheckTaskFinied()) { try { var data = targetUnit.GetTaskData(); var saveFile = targetUnit.ReadDumpData(data); table.Status = TableProcessingTypes.DumpDataFinished; OnMessageNotify($"目标{targetUnit.Target}对表{dbName}.{tableName}数据下载完成:{saveFile}", MessageNotifyTypes.Info); } catch (Exception ex) { table.Status = TableProcessingTypes.LoadExampleDataEndFinished; OnMessageNotify($"目标{targetUnit.Target}对表{dbName}.{tableName}数据下载失败.", MessageNotifyTypes.Info); } } break; case TableProcessingTypes.DumpDataFinished: targetUnit.CurrentTickTable = null; break; default: targetUnit.CurrentTickTable = null; break; } } } } Thread.Sleep(500); } } catch (Exception) { return; } }