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