/// <summary> /// 服務清單結束後 /// </summary> /// <param name="schedule"></param> /// <param name="id"></param> /// <param name="success"></param> /// <param name="message"></param> /// <param name="workSeconds"></param> protected void ScheduleFinish(ScheduleBase schedule, int id, bool success, string message, double workSeconds) { try { lock (_Lock) { ThreadCounter--; _Schedules.Remove(schedule); MaxThreadAutoReset.Set(); } if (success) { //回壓狀態,之後寫入至ELK ScheduleTaskModule.Complete(id, string.Format("{0} Completed,Use Time(sec):{1}, Run Server:{2}", schedule.Task.ScheduleType.ToString(), workSeconds, _ScheduleServer)); } else { //回壓狀態,之後寫入至ELK ScheduleTaskModule.Fail(id, string.Format("{0} Fail,Error Message:{1}, Run Server:{2}", schedule.Task.ScheduleType.ToString(), message, _ScheduleServer)); } } catch (Exception ex) { ScheduleTaskModule.Exception(id, $"{schedule.Task.ScheduleType.ToString()} Exception,Error Message:{message}, Run Server:{_ScheduleServer}, ExceptionMsg:{ex.Message}, ExceptionStackTrace:{ex.StackTrace}"); } }
/// <summary> /// 執行清單 /// </summary> private void CallScheduelBaseII() { ScheduleBase schedule = GetNextJob();//去RabbitMQ 取下一個Message if (schedule != null) { //紀錄開始動作 ScheduleTaskModule.Start(schedule.Task.ID, string.Format("{0} Start, Run Server:{1}", schedule.Task.ScheduleType.ToString(), _ScheduleServer)); lock (_Lock) { _Schedules.Add(schedule); schedule._OnFinished += new ScheduleBase.FinishedHandler(ScheduleFinish);//實作Schedule Finish ThreadCounter++; if (Debugger.IsAttached) { schedule.GO();//測試用 } else { Thread thread = new Thread(schedule.GO); thread.Start(); } } } else { //有可能無訊息了,也有可能訊息本身有錯誤格式 ScheduleTaskModule.NoMessage(_IntervalSec); System.Threading.Thread.Sleep(_IntervalSec * 1000); } }
/// <summary> /// 實作取得下一個推波訊息 /// </summary> /// <returns></returns> protected override ScheduleBase GetNextJob() { if (!enabled) { return(null); } PushMessageSchedule schedule = null; ScheduleTask scheduleTask = ScheduleTaskModule.GetNextScheduleTask(ScheduleType.PushMessage); if (scheduleTask != null) { schedule = new PushMessageSchedule(scheduleTask.ID); schedule.Task = scheduleTask; } return(schedule); }