/// <summary> /// 替换路径中的环境参数 /// </summary> /// <param name="job"></param> private void ReplacePathVars(JobOption job) { if (job.CodePath != null) { for (int i = 0; i < job.CodePath.Length; i++) { job.CodePath[i] = PathHelper.ReplaceEnvVars(job.CodePath[i]); } } if (job.SlnFiles != null) { for (int i = 0; i < job.SlnFiles.Length; i++) { job.SlnFiles[i] = PathHelper.ReplaceEnvVars(job.SlnFiles[i]); } } foreach (var action in job.Actions) { if (action.Items != null) { for (int i = 0; i < action.Items.Length; i++) { // 替换路径中的环境变量 action.Items[i] = PathHelper.ReplaceEnvVars(action.Items[i]); } } } }
public void Execute(JobOption job, bool enableConsoleOut) { if (job == null) { throw new ArgumentNullException(nameof(job)); } if (job.Actions == null) { return; } TaskContext context = new TaskContext(job, enableConsoleOut); // 替换路径中的环境参数 ReplacePathVars(job); // 填充配置中的路径 PaddingPath(job); // 记录程序的运行时环境 LogRuntimeEnvironment(context); try { foreach (TaskAction a in job.Actions) { ITask task = TaskFactory.CreateTask(a.Type); task.Execute(context, a); } } finally { SaveRunLog(context); } }
public static bool CanLinkToDailyReportPage(this JobOption job, string day) { DateTime date; if (DateTime.TryParse(day, out date) == false) { return(false); } string filename = ScanResultCache.GetTotalResultFilePath(job.Id, date); return(File.Exists(filename)); }
public ITrigger CreateTrigger(JobOption jobOption) { var triggerBuilder = TriggerBuilder.Create(); switch (jobOption.Unit) { case Configurations.IntervalUnit.Second: triggerBuilder.WithSimpleSchedule(s => { s.WithIntervalInSeconds(jobOption.IntervalTime) .RepeatForever(); }); break; case Configurations.IntervalUnit.Minute: triggerBuilder.WithSimpleSchedule(s => { s.WithIntervalInMinutes(jobOption.IntervalTime) .RepeatForever(); }); break; case Configurations.IntervalUnit.Hour: triggerBuilder.WithSimpleSchedule(s => { s.WithIntervalInHours(jobOption.IntervalTime) .RepeatForever(); }); break; case Configurations.IntervalUnit.Day: triggerBuilder.WithSimpleSchedule(s => { s.WithIntervalInHours(jobOption.IntervalTime * 24) .RepeatForever(); }); break; } if (jobOption.DelayTime == 0) { triggerBuilder = triggerBuilder.StartNow(); } else { var startTime = DateTime.UtcNow.AddMilliseconds(jobOption.DelayTime); triggerBuilder = triggerBuilder.StartAt(startTime); } return(triggerBuilder.Build()); }
public ITrigger CreateTrigger(JobOption jobOption) { var triggerBuilder = CreateTriggerBuilder(); if (jobOption.DelayTime == 0) { triggerBuilder = triggerBuilder.StartNow(); } else { var startTime = DateTime.UtcNow.AddMilliseconds(jobOption.DelayTime); triggerBuilder = triggerBuilder.StartAt(startTime); } return(triggerBuilder.Build()); }
public TaskContext(JobOption job, bool enableConsoleOut) { if (job == null) { throw new ArgumentNullException(nameof(job)); } _job = job; _enableConsoleOut = enableConsoleOut; // 每个小组使用一个临时目录 _tempPath = InitTempDirectory(job.Id); // 初始化数据结果对象 _totalResult = InitTask(); }
public ITrigger CreateTrigger(JobOption jobOption) { if (!Regex.IsMatch(jobOption.CronExpression, cornRegEx)) { throw new QuartzException("Corn表达式错误"); } var triggerBuilder = TriggerBuilder.Create() .WithCronSchedule(jobOption.CronExpression); if (jobOption.DelayTime == 0) { triggerBuilder = triggerBuilder.StartNow(); } else { var startTime = DateTime.UtcNow.AddMilliseconds(jobOption.DelayTime); triggerBuilder = triggerBuilder.StartAt(startTime); } return(triggerBuilder.Build()); }
/// <summary> /// 填充配置中的路径 /// </summary> /// <param name="job"></param> private void PaddingPath(JobOption job) { // 对于大多数项目来说,都有一个根目录 // 而在具体配置文件中,同样的目录会出现在 CodePath,SlnFiles,AssemblyScan 中重复配置 // 这样既不方便,看起来也不美观, // 这里允许 SlnFiles,AssemblyScan 引用 CodePath 路径,而不需要显式指定 // 例如:CodePath : G:\my-github\SpecChecker\demo-code\SpeChecker.DEMO // 那么可以这样配置 SlnFiles : \SpeChecker.DEMO.sln // 只适合配置一个路径时启用 if (job.CodePath != null && job.CodePath.Length == 1) { string basePath = job.CodePath[0].TrimEnd('\\'); if (job.SlnFiles != null) { for (int i = 0; i < job.SlnFiles.Length; i++) { if (job.SlnFiles[i].Length > 0 && job.SlnFiles[i][0] == '\\') { job.SlnFiles[i] = basePath + job.SlnFiles[i]; } } } foreach (var action in job.Actions) { // 只处理 AssemblyScan 节点 if (action.Type == "AssemblyScan" && action.Items != null) { for (int i = 0; i < action.Items.Length; i++) { // 先反序列化,用于获取路径 string line = action.Items[i]; bool changed = false; TextLineSerializer serializer = new TextLineSerializer(); AssemblyScanOption option = serializer.Deserialize <AssemblyScanOption>(line); if (string.IsNullOrEmpty(option.Sln) == false) { if (option.Sln[0] == '\\') { option.Sln = basePath = option.Sln; changed = true; } } if (string.IsNullOrEmpty(option.Bin) == false) { if (option.Bin[0] == '\\') { option.Bin = basePath + option.Bin; changed = true; } } // 如果有变化,就替换配置中的参数 if (changed) { action.Items[i] = serializer.Serialize(option); } } } } } }
public async Task StartJob(JobOption option) { _jobHub = Connect(SpearType.Jobs); await Task.CompletedTask; }