/// <summary> /// Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法。这不是说这个 Trigger 将不再触发了,而仅仅是当前 Trigger 的触发(并且紧接着的 Job 执行) 结束时。这个 Trigger /// 也许还要在将来触发多次的。 /// Called by the Quartz.IScheduler when a Quartz.ITrigger has fired, it's associated /// Quartz.IJobDetail has been executed, and it's Quartz.Spi.IOperableTrigger.Triggered(Quartz.ICalendar) /// method has been called. /// </summary> /// <param name="trigger">The Quartz.ITrigger that was fired.</param> /// <param name="context"> /// The Quartz.IJobExecutionContext that was passed to the /// Quartz.IJob'sQuartz.IJob.Execute(Quartz.IJobExecutionContext) method. /// </param> /// <param name="triggerInstructionCode"> /// The result of the call on the /// Quartz.ITrigger'sQuartz.Spi.IOperableTrigger.Triggered(Quartz.ICalendar) method. /// </param> /// <param name="cancellationToken">The cancellation instruction.</param> /// <returns></returns> public virtual async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default) { Debug(nameof(ITriggerListener), nameof(TriggerComplete)); var beginTicks = context.GetJobBeginDateTimeTicks(); var milliseconds = (long)TimeSpan.FromTicks(DateTime.Now.Ticks - beginTicks).TotalMilliseconds; if (milliseconds > 5 * 1000) { JobLogHelper.Warn($"{JobInfo} 耗时{milliseconds} ms ", null, nameof(TriggerComplete)); } else if (milliseconds > 0) { JobLogHelper.Info($"{JobInfo} 耗时{milliseconds} ms ", nameof(TriggerComplete)); } var bizState = context.GetJobBusinessState(); var bizStatsStr = bizState.ToString(); if (bizState == JobBusinessStateEnum.Success) { bizStatsStr = $"<font color=#20CE43>{bizState}</font>"; } if (bizState == JobBusinessStateEnum.Fail) { bizStatsStr = $"<font color=#FF0000>{bizState}</font>"; } await DoNoticeAsync($"耗时 {milliseconds} ms. 任务状态为 {bizStatsStr}", context.GetTempConfig("BizContent").ToString()); await Task.CompletedTask; }