public bool Remove(Guid jobId) { lock (syncLock) { if (JobRuntimePool.ContainsKey(jobId)) { JobRuntimeInfo jobRuntimeInfo = null; JobRuntimePool.TryGetValue(jobId, out jobRuntimeInfo); if (jobRuntimeInfo != null) { var tiggerKey = new TriggerKey(jobRuntimeInfo.JobModel.JobName, jobRuntimeInfo.JobModel.JobGroup); scheduler.PauseTrigger(tiggerKey); scheduler.UnscheduleJob(tiggerKey); scheduler.DeleteJob(new JobKey(jobRuntimeInfo.JobModel.JobName, jobRuntimeInfo.JobModel.JobGroup)); JobRuntimePool.TryRemove(jobId, out jobRuntimeInfo); JobOperator.UpdateJobStatus(jobRuntimeInfo.JobModel.ID, 0); if (!JobRuntimePool.Any(p => p.Value.AppDomain == jobRuntimeInfo.AppDomain)) { AppDomainLoader <BaseJob> .UnLoad(jobRuntimeInfo.AppDomain); } return(true); } } return(false); } }
static int Main(string[] args) { return((int)HostFactory.Run(x => { GlobalConfiguration.ConfigureDBConnectionString(); x.UseLog4Net("log4net.config"); x.UseAssemblyInfoForServiceInfo(); x.Service <WebServer>(s => { s.ConstructUsing(name => new WebServer(new JobWatcher("Jobs", cl => { var assemblyNames = cl.Select(c => Path.GetFileNameWithoutExtension(c)).ToList(); foreach (var assemblyName in assemblyNames) { var jobInfos = JobOperator.GetJobInfoList(assemblyName); JobPoolManager.Instance.RemoveAll(jobInfos.Select(t => t.ID).ToList()); jobInfos.ForEach(jobInfo => JobPoolManager.Scheduler.ScheduleJob(jobInfo)); } }))); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); })); }
public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode) { var jobKey = context.JobDetail.Key; //Logger.Instance.InfoFormat($"{jobKey.Name}--{jobKey.Group} completed,{context.NextFireTimeUtc.Value.DateTime}"); JobOperator.UpdateNextFireTimeAsync(jobKey.Name, jobKey.Group, TimeZoneInfo.ConvertTimeFromUtc(context.NextFireTimeUtc.Value.DateTime, TimeZoneInfo.Local)).Wait(); }
public override bool BeforeExecute(JobExecutionContext context) { base.BeforeExecute(context); //Gets the dependent job list and schedule them. var dependentJobs = JobOperator.GetDependentJobInfoList(context.JobName, context.JobGroup); JobExecutor.Execute(dependentJobs); return(true); }
public bool RemoveAll(List <Guid> jboIds) { foreach (var jobId in jboIds) { JobOperator.UpdateJobStatus(jobId, 0); Remove(jobId); } return(true); }
public virtual void Dispose() { if (scheduler != null && !scheduler.IsShutdown) { foreach (var jobId in JobRuntimePool.Keys) { JobOperator.UpdateJobStatus(jobId, 0); } scheduler.Shutdown(); } }
public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context) { var jobKey = context.JobDetail.Key; //Logger.Instance.InfoFormat($"{jobKey.Name}--{jobKey.Group} executing,{context.FireTimeUtc.Value.DateTime}"); var jobStatus = JobOperator.GetJobStatus(jobKey.Name, jobKey.Group); if (jobStatus == 0) { return(true); //When returns true, the job would't be executed. } JobOperator.UpdateRecentRunTimeAsync(jobKey.Name, jobKey.Group, TimeZoneInfo.ConvertTimeFromUtc(context.FireTimeUtc.Value.DateTime, TimeZoneInfo.Local)).Wait(); return(false); }
public bool Add(Guid jobId, JobRuntimeInfo jobRuntimeInfo) { lock (syncLock) { if (!JobRuntimePool.ContainsKey(jobId)) { var jobInfo = jobRuntimeInfo.JobModel; var jobName = jobInfo.JobName; var jobGroup = string.IsNullOrWhiteSpace(jobInfo.JobGroup) ? null : jobInfo.JobGroup; var jobKey = new JobKey(jobName, jobGroup); if (JobRuntimePool.TryAdd(jobId, jobRuntimeInfo)) { //Set job status to stop if (JobOperator.UpdateJobStatus(jobInfo.ID, 0)) { jobInfo.Status = 0; } IDictionary <string, object> jobData = new Dictionary <string, object>() { ["JobId"] = jobInfo.ID.ToString() }; //Builds the job detail var jobDetail = JobBuilder.Create <QuartzJob>() .WithIdentity(jobKey) .SetJobData(new JobDataMap(jobData)) .Build(); //Builds the job trigger var jobTriggerBuilder = TriggerBuilder.Create() .WithIdentity($"{jobName}Trigger", jobGroup) .WithDescription($"{jobName} Trigger") .WithCronSchedule(jobInfo.CronExpression, x => x.WithMisfireHandlingInstructionDoNothing()); //if (jobInfo.StartTime.HasValue) // jobTriggerBuilder.StartAt(jobInfo.StartTime.Value); //if (jobInfo.EndTime.HasValue) // jobTriggerBuilder.EndAt(jobInfo.EndTime.Value); var jobTrigger = jobTriggerBuilder.Build(); //Decides whether to schedule the job by status scheduler.ScheduleJob(jobDetail, jobTrigger); //if (jobInfo.Status == 0) scheduler.PauseJob(jobKey); return(true); } } return(false); } }
public override void AfterExecute(JobExecutionContext context) { _stopwatch.Stop(); Logger.Instance.InfoFormat("Execute `{0}` elapsed time:{1} ms.", GetType().FullName, _stopwatch.ElapsedMilliseconds); JobOperator.AddJobPerformance(new JobPerformance { ID = Guid.NewGuid(), JobName = context.JobName, JobGroup = context.JobGroup, StartTime = _startTime, EndTime = DateTime.Now, CPU = (decimal)AppDomain.CurrentDomain.MonitoringTotalProcessorTime.TotalSeconds, Memory = AppDomain.CurrentDomain.MonitoringSurvivedMemorySize * 1m / 1024 / 1024, CreateTime = DateTime.Now }); }
private dynamic GetJobPerformanceTrend() { var data = new List <Dictionary <string, dynamic> >(); var performanceTrendList = JobOperator.GetPerformanceTrend(); var dates = performanceTrendList.GroupBy(p => p.Date).OrderBy(p => p.Key).Select(p => p.Key).ToList(); var jobs = performanceTrendList.GroupBy(p => p.Job).OrderBy(p => p.Key).Select(p => p.Key).ToList(); foreach (var date in dates) { var dict = new Dictionary <string, dynamic>(); dict.Add("period", date); foreach (var job in jobs) { var jm = performanceTrendList.FirstOrDefault(p => p.Date == date && p.Job == job); dict.Add(job, jm == null ? 0 : jm.ElapsedTime); } data.Add(dict); } return(Response.AsJson(new { data = data, ykeys = jobs })); }