Exemple #1
0
        /// <summary>
        /// 监听
        /// </summary>
        /// <param name="methodName"></param>
        private static void MonitorResult(Func <ILogger, ISerializer, ResponseCommon> methodName)
        {
            while (true)
            {
                Thread.Sleep(sleepTime);
                Stopwatch watch = new Stopwatch();

                ResponseCommon result = new ResponseCommon();
                try
                {
                    watch.Start();

                    string redisContent = string.Empty;
                    result = methodName(m_ilogger, m_serializer);
                    ConsoleColor msgColor = ConsoleColor.White;
                    if (!result.IsSuccess)
                    {
                        msgColor = ConsoleColor.White;
                    }
                    else
                    {
                        msgColor = ConsoleColor.Green;
                    }

                    watch.Stop();

                    messageQueue.Enqueue(new WriteMessage()
                    {
                        ShowColor = msgColor, ShowText = $"[{result.MsgType}]-[耗时:{ watch.Elapsed.TotalMilliseconds}]{result.MessageContent}"
                    });


                    //==========压力测试代码==========
                    if (result.IsSuccess)
                    {
                        StackExchange.Redis.IDatabase db = BaseConnect.RedisHelper.GetDatabase(8);
                        db.ListRightPush("test:" + result.MessageContent.Substring(0, 7), "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "]处理" + result.MsgType + "业务:" + result.MessageContent);

                        if (result.MsgType == MsgType.InParking)
                        {
                            //入场成功后,再记录数据到出场车牌列表(以便执行出场业务)
                            db.ListRightPush("ExitDataList", result.RedisContent);
                        }
                    }

                    //==========压力测试代码==========
                }
                catch (Exception ex)
                {
                    m_ilogger.LogFatal(LoggerLogicEnum.Tools, "", "", "", "Fujica.com.cn.MonitorServiceClient.MonitorResult", $"执行{result.MsgType}数据发生异常;参数:{result.RedisContent}", ex.ToString());

                    messageQueue.Enqueue(new WriteMessage()
                    {
                        ShowColor = ConsoleColor.Yellow, ShowText = $"[{result.MsgType}]-[{DateTime.Now}]系统发生异常,redis数据:{result.RedisContent};系统异常:{ex.ToString()}"
                    });
                }
            }
        }
        public async Task Execute(IJobExecutionContext context)
        {
            JobKey     key     = context.JobDetail.Key;
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string     jobSays = dataMap.GetString("guid");

            var taskPlan = await _SqlLiteContext.TaskPlan.AsNoTracking().SingleOrDefaultAsync(o => o.GUID == jobSays);

            _logger.LogDebug("{TaskName}({EventId}):开始执行!", taskPlan.Name, jobSays);
            var TaskPlan = await _SqlLiteContext.TaskPlan.AsNoTracking().Where(o => o.GUID == jobSays).FirstOrDefaultAsync();

            string orgCode    = TaskPlan.OrgCode;
            var    OrgSetting = await _SqlLiteContext.OrgSetting.AsNoTracking().Where(o => o.CODE == orgCode).FirstOrDefaultAsync();

            string connectString = OrgSetting.ConnectingString;
            string orgType       = string.Empty;
            var    client        = _httpClientFactory.CreateClient();

            try
            {
                switch (OrgSetting.DBType)
                {
                //Oracle 0
                //SqlServer  1
                //MySql  2
                //Sqlite  3
                case "0":
                    orgType = DBTypeEnum.Oracle.ToString();
                    break;

                case "1":
                    orgType = DBTypeEnum.SqlServer.ToString();
                    break;

                case "2":
                    orgType = DBTypeEnum.MySql.ToString();
                    break;

                case "3":
                    orgType = DBTypeEnum.Sqlite.ToString();
                    break;

                default:
                    break;
                }
                _SqlHelper = new ExecSqlHelper(connectString, orgType);

                //List<DataSource> dataSources = new List<DataSource>();
                var taskPlanList = await _SqlLiteContext.TaskPlanRelation.AsNoTracking().Where(o => o.TaskPlanGuid == jobSays).FirstOrDefaultAsync();

                string dataJsonData       = string.Empty;
                string dataJsonDataDetail = string.Empty;
                //string taskApiUrl = _Configuration.GetSection("TaskApiUrls").GetSection("TaskApiUrl").Value;
                string         paramJson      = string.Empty;
                ResponseCommon responseCommon = new ResponseCommon();
                string         groupSql       = string.Empty;
                string[]       sqlStrings;
                string         sqlString    = string.Empty;
                string         afterSuccess = string.Empty;
                string         afterFalse   = string.Empty;
                string         MainKey      = string.Empty;
                string         MainKeyValue = string.Empty;
                var            systemKes    = await _SqlLiteContext.SystemKeys.AsNoTracking().Where(o => o.KeyName != "").ToListAsync();

                //计划中的数据源
                var dataSource = await _SqlLiteContext.OpenSql.AsNoTracking().Where(o => o.GUID == taskPlanList.OpenSqlGuid && o.IsStart == "1").ToListAsync();

                for (int j = 0; j < dataSource.Count; j++)
                {
                    MainKey   = dataSource[j].MainKey;
                    groupSql  = dataSource[j].GroupSqlString;
                    sqlString = dataSource[j].SqlString;

                    foreach (var item in systemKes)
                    {
                        groupSql  = groupSql.Replace($"[{item.KeyName}]", item.KeyValue);
                        sqlString = sqlString.Replace($"[{item.KeyName}]", item.KeyValue);
                    }

                    List <Datas> datas = new List <Datas>();

                    if (!groupSql.Contains(MainKey))
                    {
                        //主数据源中不包含关键字MainKey
                        _logger.LogError("{TaskName}({EventId}):\r\n主数据源中不包含关键字{MainKey}", taskPlan.Name, jobSays, MainKey);
                    }
                    else
                    {
                        //获取当前任务中分组数据
                        var dataMaindt = await _SqlHelper.GetDataTableAsync(groupSql);

                        //MainKeyValue = dataMaindt.Rows[]
                        for (int h = 0; h < dataMaindt.Rows.Count; h++)
                        {
                            List <DataTable> dataTables = new List <DataTable>();
                            DataTable        maindetail = dataMaindt.Copy();
                            MainKeyValue = string.Empty;
                            MainKeyValue = dataMaindt.Rows[h][MainKey].ToString();
                            afterSuccess = dataSource[j].AfterSqlString.Replace($"#{MainKey}#", MainKeyValue);
                            afterFalse   = dataSource[j].AfterSqlstring2.Replace($"#{MainKey}#", MainKeyValue);
                            sqlStrings   = sqlString.Replace($"#{MainKey}#", MainKeyValue).Split(";");
                            //_logger.LogInformation("{TaskName}{EventId}:\r\n数据源:{dataSource[j].Name },\r\n分组sql:{groupSql },\r\n选择sql:{ sqlString },\r\n成功sql:{ afterSuccess },\r\n失败sql:{ afterFalse}", taskPlan.Name, jobSays, dataSource[j].Name, groupSql, sqlString, afterSuccess, afterFalse);
                            dataTables.Clear();
                            for (int k = 0; k < sqlStrings.Length; k++)
                            {
                                dataTables.Add(await _SqlHelper.GetDataTableAsync(sqlStrings[k]));
                            }

                            // var dataDetaildt = await _SqlHelper.GetDataTableAsync(sqlString);
                            var sss = dataMaindt.Rows[h];
                            maindetail.Rows.Clear();
                            maindetail.ImportRow(dataMaindt.Rows[h]);
                            datas.Add(new Datas {
                                DataMain = maindetail, DataDetail = dataTables
                            });
                        }
                        paramJson = JsonConvert.SerializeObject(new DoTaskJson
                        {
                            OpenSqlGuid = dataSource[j].GUID,
                            Data        = datas
                        });

                        string result = await CommonHelper.HttpPostAsync(TaskPlan.DllOrUrl, paramJson, client);

                        _logger.LogInformation("{TaskName}({EventId}):\r\n接口地址:{TaskPlan.TaskUrl},\r\n入参Json{paramJson},\r\n返回:{result}", taskPlan.Name, jobSays, TaskPlan.DllOrUrl, paramJson, result);
                        responseCommon = (ResponseCommon)System.Text.Json.JsonSerializer.Deserialize(result, typeof(ResponseCommon));
                        //记录日志
                        if (responseCommon.code == "0")
                        {
                            var afterS = await _SqlHelper.ExecSqlAsync(afterSuccess);

                            //记录日志
                            _logger.LogInformation("{TaskName}({EventId}):\r\n数据源:{dataSource[j].Name },\r\n成功后执行语句为:{afterSuccess}\r\n,返回:{afterS}", taskPlan.Name, jobSays, dataSource[j].Name, afterSuccess, afterS);
                        }
                        else
                        {
                            var afterF = await _SqlHelper.ExecSqlAsync(afterFalse);

                            //记录日志
                            _logger.LogInformation("{TaskName}({EventId}):\r\n数据源:{dataSource[j].Name },\r\n失败后执行语句为:{afterFalse}\r\n,返回:{afterF}", taskPlan.Name, jobSays, dataSource[j].Name, afterFalse, afterF);
                        }
                    }
                }
            }

            catch (Exception ex)
            {
                _logger.LogError("{TaskName}({EventId})错误信息:{ex.Message},{ex.StackTrace}", taskPlan.Name, jobSays, ex.Message, ex.StackTrace);
                return;
            }
            finally
            {
                await _SqlHelper.DisposeAsync();
            }
        }