Esempio n. 1
0
 public async Task <Boolean> DeleteModelAsync(string modelCode)
 {
     return(await Task.Run <Boolean>(() => {
         var db = Repository.GetDbContext();
         return db.Ado.UseTran <Boolean>(() =>
         {
             DmeModel model = db.Queryable <DmeModel>().Single(m => m.SysCode == modelCode);
             if (null == model)
             {
                 throw new BusinessException((int)EnumSystemStatusCode.DME_FAIL, $"模型[{modelCode}]不存在");
             }
             model.Status = 0;
             db.Updateable <DmeModel>(model).UpdateColumns(m => m.Status).ExecuteCommand();
             // 级联逻辑删除版本
             var updateCount = db.Updateable <DmeModelVersion>()
                               .UpdateColumns(it => new DmeModelVersion()
             {
                 Status = 0
             })
                               .Where(it => it.ModelId == model.Id).ExecuteCommand();
             LOG.Info($"共更新[{updateCount}]条版本记录");
             // 暂停模型相关的任务
             List <DmeTask> tasks = db.Queryable <DmeTask>().Where(t => t.ModelId == model.Id).ToList();
             if (tasks?.Count > 0)
             {
                 foreach (var subTask in tasks)
                 {
                     DmeQuartzScheduler <TaskRunnerJob> .PauseJob(subTask.SysCode, model.ModelTypeCode);
                 }
             }
             return true;
         }).Data;
     }));
 }
Esempio n. 2
0
        public object OperateTask(string taskCode, int operation)
        {
            var     db   = Repository.GetDbContext();
            DmeTask task = db.Queryable <DmeTask>().Single(t => t.SysCode == taskCode);

            if (null == task)
            {
                throw new BusinessException((int)EnumSystemStatusCode.DME_FAIL, $"任务[{taskCode}]不存在");
            }
            DmeModel model = db.Queryable <DmeModel>().InSingle(task.ModelId);

            switch (operation)
            {
            case 0:
                LOG.Info($"停止任务[{taskCode}]");
                task.Status   = EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_STOP);
                task.LastTime = DateUtil.CurrentTimeMillis;
                db.Updateable <DmeTask>(task).UpdateColumns(t => new { task.Status, task.LastTime }).ExecuteCommand();
                DmeQuartzScheduler <TaskRunnerJob> .PauseJob(task.SysCode, model.ModelTypeCode);

                break;

            case 1:
                // @TODO 有待完成
                LOG.Info($"重启任务[{taskCode}]");
                task.Status   = EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_RUNNING);
                task.LastTime = DateUtil.CurrentTimeMillis;
                db.Updateable <DmeTask>(task).UpdateColumns(t => new { task.Status, task.LastTime }).ExecuteCommand();
                DmeQuartzScheduler <TaskRunnerJob> .ResumeJob(task.SysCode, model.ModelTypeCode);

                break;

            case -1:
                LOG.Info($"删除任务[{taskCode}]");
                // 删除与任务相关的步骤记录和结果记录
                int count = db.Deleteable <DmeTaskRuleStep>(trs => trs.TaskId == task.Id).ExecuteCommand();
                LOG.Info($"删除任务[{taskCode}]关联的[{count}]个步骤记录");
                count = db.Deleteable <DmeTaskResult>(tr => tr.TaskId == task.Id).ExecuteCommand();
                LOG.Info($"删除任务[{taskCode}]关联的[{count}]个结果记录");
                // 从mongo中获取
                var filter = Builders <TaskResultColl> .Filter.And(
                    Builders <TaskResultColl> .Filter.Eq("TaskId", task.Id));

                MongodbHelper <TaskResultColl> .DeleteMany(ServiceFactory.MongoDatabase, filter);

                db.Deleteable <DmeTask>(task).ExecuteCommand();
                DmeQuartzScheduler <TaskRunnerJob> .DeleteJob(task.SysCode, model.ModelTypeCode);

                break;

            default:
                break;
            }
            return(true);
        }
Esempio n. 3
0
        public async Task <DmeTask> CreateTaskAsync(NewTaskReqDTO dto)
        {
            // 验证数据库是否存在指定模型版本信息
            SqlSugarClient db = base.Repository.GetDbContext();
            // 查询模型版本
            DmeModelVersion modelVersion = db.Queryable <DmeModelVersion>().Single(mv => mv.SysCode == dto.ModelVersionCode);

            if (null == modelVersion)
            {
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"模型的版本[{dto.ModelVersionCode}]不存在");
            }
            // Single方法,如果查询数据库多条数据,会抛出异常
            DmeModel model = db.Queryable <DmeModel>().Single(m => m.Id == modelVersion.ModelId);

            if (null == model)
            {
                throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"模型[{modelVersion.ModelId}]不存在");
            }
            // 获取模型类型
            DmeModelType modelType = db.Queryable <DmeModelType>().InSingle(model.ModelTypeId);
            // 查找关联的算法信息
            IList <DmeRuleStep> ruleSteps = db.Queryable <DmeRuleStep>().Where(rs => rs.ModelId == model.Id && rs.VersionId == modelVersion.Id).ToList();

            if (0 == ruleSteps?.Count)
            {
                LOG.Warn($"模型[{model.SysCode}]的版本[{dto.ModelVersionCode}]下没有可执行步骤,停止运行");
                return(null);
            }
            DmeTask newTask = db.Ado.UseTran <DmeTask>(() =>
            {
                // 每执行一次模型,生成一次任务
                newTask = new DmeTask
                {
                    SysCode    = GuidUtil.NewGuid(),
                    CreateTime = DateUtil.CurrentTimeMillis,
                    Status     = EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_WAITTING),
                    ModelId    = model.Id,
                    VersionId  = modelVersion.Id,
                    Remark     = dto.Remark,
                    NodeServer = NetAssist.GetLocalHost()
                };
                if (string.IsNullOrWhiteSpace(dto.Name))
                {
                    newTask.Name = "task-" + newTask.CreateTime;
                }
                else
                {
                    newTask.Name = dto.Name;
                }

                newTask.LastTime = newTask.CreateTime;
                newTask          = db.Insertable <DmeTask>(newTask).ExecuteReturnEntity();
                return(newTask);
            }).Data;

            // 创建job
            await DmeQuartzScheduler <TaskRunnerJob> .NewJob(
                newTask.SysCode,
                modelType.SysCode,
                dto.CronExpression,
                new Dictionary <string, object> {
                { TaskRunnerJob.TASK_CODE_KEY, newTask.SysCode }
            },
                1 == dto.StartNow,
                DateTimeOffset.Now.AddSeconds(dto.InSeconds),
                dto.Remark);

            return(newTask);
        }
Esempio n. 4
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            // 设置数据源,读取appsettings.json配置文件
            GlobalSystemConfig.DBConnectionString = this.Configuration.GetConnectionString("DataSource");
            // 注册缓存对象
            services.AddMemoryCache();
            IConfigurationSection connectionStringsSection = this.Configuration.GetSection("ConnectionStrings");
            IConfigurationSection cacheProviderSection     = connectionStringsSection.GetSection("CacheProvider");

            if (cacheProviderSection != null)
            {
                try
                {
                    string type = cacheProviderSection.GetValue <string>("type");
                    if ("redis".Equals(type, StringComparison.OrdinalIgnoreCase))
                    {
                        // redis 分布式缓存
                        RedisCacheProvider provider = cacheProviderSection.GetSection("provider").Get <RedisCacheProvider>();
                        services.AddSingleton(typeof(ICacheService), new RedisCacheService(new RedisCacheOptions
                        {
                            Configuration = provider.HostName + ":" + provider.Port,
                            InstanceName  = provider.InstanceName
                        }, provider.DataBase));
                    }
                    else if ("redis.r.w".Equals(type, StringComparison.OrdinalIgnoreCase))
                    {
                        // redis读写分离
                        RedisRWConfigInfo provider     = cacheProviderSection.GetSection("provider").Get <RedisRWConfigInfo>();
                        RedisManager      redisManager = new RedisManager(provider);
                        services.AddSingleton(typeof(ICacheService), new RedisRWCacheService(redisManager.GetClient()));
                    }
                }
                catch (Exception ex)
                {
                    LOG.Error(ex, "redis连接失败,准备启用MemoryCache服务");
                    SetCacheService(services);
                }
            }
            else
            {
                SetCacheService(services);
            }
            // mongo
            IConfigurationSection mongoSection = this.Configuration.GetSection("ConnectionStrings").GetSection("Mongo");

            if (mongoSection != null)
            {
                try
                {
                    // 注册mongo连接信息
                    MongodbHost mongohost = mongoSection.Get <MongodbHost>();
                    services.AddSingleton(typeof(MongodbHost), mongohost);
                    // IMongoClient mongoClient = new MongoClient(mongohost.Connection);
                    IMongoClient mongoClient = MongodbManager <object> .GetMongodbClient(mongohost.ConnectionString);

                    services.AddSingleton(typeof(IMongoClient), mongoClient);
                    IMongoDatabase mongoDatabase = mongoClient.GetDatabase(mongohost.DataBase);
                    services.AddSingleton(typeof(IMongoDatabase), mongoDatabase);
                }
                catch (Exception ex)
                {
                    LOG.Error(ex, "mongo连接失败");
                }
            }
            // 注册知识库
            services.AddSingleton <IRepository, Repository>();
            // 注册版本服务
            services.AddSingleton <IVersionService, VersionService>();
            // 注册用户服务
            services.AddSingleton <IUserService, UserService>();
            // 注册模型服务
            services.AddSingleton <IModelService, ModelService> ();
            // 注册数据源服务
            services.AddSingleton <IDataSourceService, DataSourceService>();
            // 注册算法服务
            services.AddSingleton <IAlgorithmService, AlgorithmService>();
            // 注册业务日志服务
            services.AddSingleton <ILogService, LogService>();
            // 注册任务服务
            services.AddSingleton <ITaskService, TaskService>();
            // 设置全局
            IServiceProvider serviceProvider = services.BuildServiceProvider();

            ServiceFactory.CacheService  = serviceProvider.GetService <ICacheService>();
            ServiceFactory.MongoHost     = serviceProvider.GetService <MongodbHost>();
            ServiceFactory.MongoClient   = serviceProvider.GetService <IMongoClient>();
            ServiceFactory.MongoDatabase = serviceProvider.GetService <IMongoDatabase>();
            // 消息相关
            IConfigurationSection messageSection = connectionStringsSection.GetSection("Message");

            if (messageSection != null)
            {
                // 消息
                IConfigurationSection mqSection = messageSection.GetSection("MQ");
                if (mqSection != null)
                {
                    KafkaSetting kafkaSetting = mqSection.Get <KafkaSetting>();
                    if (kafkaSetting.Switch)
                    {
                        KafkaConsumer.CreateConsumer(kafkaSetting.Opinion.GroupId, kafkaSetting.Opinion.Servers, kafkaSetting.Opinion.Topics);
                        KafkaConsumer.Start();
                        KafkaProducer.CreateProducer(kafkaSetting.Opinion.Servers);
                    }
                }
                // websocket
                IConfigurationSection websocketSection = messageSection.GetSection("Websocket");
                if (websocketSection != null)
                {
                    WebsocketSetting websocketSetting = websocketSection.Get <WebsocketSetting>();
                    WebsocketFleckServer.CreateWebsocketServer(websocketSetting.NodeId, websocketSetting.Port, websocketSetting.Host);
                }
            }
            // scheduler,注入参数设置
            IConfigurationSection schedulerSection = this.Configuration.GetSection("Scheduler");

            if (schedulerSection != null)
            {
                if (schedulerSection.GetValue <Boolean>("switch"))
                {
                    IConfigurationSection propertiesSection = schedulerSection.GetSection("properties");
                    var values = propertiesSection.GetChildren()
                                 .Select(item => new KeyValuePair <string, string>(item.Key,
                                                                                   item.Value.Contains("$") ? Configuration.GetValue <string>(item.Value.Replace("${", "").Replace("}", "")) : item.Value))
                                 .ToDictionary(x => x.Key, x => x.Value);

                    DmeQuartzScheduler <TaskRunnerJob> .SetSchedulerProperties(DataUtil.ToNameValueCollection(values));

                    // 调取开启。如果不开启,则不会执行。
                    DmeQuartzScheduler <TaskRunnerJob> .Start().GetAwaiter();
                }
            }

            // DemoScheduler.RunProOracle().Wait();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info
                {
                    Version        = "v1",
                    Title          = "Dist Model Engine接口文档",
                    Description    = "RESTful API for DME",
                    TermsOfService = "None",
                    Contact        = new Contact {
                        Name = "weifj", Email = "*****@*****.**", Url = "https://github.com/leoterry-ulrica/dme"
                    }
                });
                //Set the comments path for the swagger json and ui.
                var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                var xmlPath  = Path.Combine(basePath, "Dist.Dme.WebApi.xml");
                c.IncludeXmlComments(xmlPath);
                //  c.OperationFilter<HttpHeaderOperation>(); // 添加httpHeader参数
            });

            // 配置日志服务
            services.AddLogging();
        }