public void RunBatchJobs() { lock (runBatchJobsLock) { log.Info("----------------------------------Invincible's dividing line---------------------------------------"); log.Info("BatchJobs run start."); IList<Trigger> tobeFiredTriggerList = this.GetTobeFiredTrigger(); if (tobeFiredTriggerList != null && tobeFiredTriggerList.Count > 0) { //Parallel.ForEach(tobeFiredTriggerList, (tobeFiredTrigger) => foreach (Trigger tobeFiredTrigger in tobeFiredTriggerList) { Thread.Sleep(500); JobDetail jobDetail = tobeFiredTrigger.JobDetail; RunLog runLog = new RunLog(); try { #region Job运行前处理 BeforeJobRun(runLog, tobeFiredTrigger); #endregion #region Job参数获取 JobDataMap dataMap = new JobDataMap(); IList<JobParameter> jobParameterList = genericMgr.FindAllWithCustomQuery<JobParameter> ("from JobParameter where JobCode = ?", jobDetail.Code); if (jobParameterList != null && jobParameterList.Count > 0) { foreach (JobParameter jobParameter in jobParameterList) { log.Debug("Set Job Parameter Name:" + jobParameter.Key + ", Value:" + jobParameter.Value); dataMap.PutData(jobParameter.Key, jobParameter.Value); } } #endregion #region Trigger参数获取 IList<TriggerParameter> triggerParameterList = genericMgr.FindAllWithCustomQuery<TriggerParameter> ("from TriggerParameter where TriggerName = ?", tobeFiredTrigger.Name); if (triggerParameterList != null && triggerParameterList.Count > 0) { foreach (TriggerParameter triggerParameter in triggerParameterList) { log.Debug("Set Trigger Parameter Name:" + triggerParameter.Key + ", Value:" + triggerParameter.Value); if (!dataMap.ContainKey(triggerParameter.Key)) { dataMap.PutData(triggerParameter.Key, triggerParameter.Value); } } } #endregion #region 运行Job //反射方法 //object newInstance = Assembly.GetExecutingAssembly().CreateInstance("com.Sconit.Service.SI.Job", false); //Type.GetType("com.Sconit.Service.SI.Job").GetMethod(jobDetail.ServiceType).Invoke(newInstance, new object[] { dataMap, container }); RunJob(jobDetail.ServiceType, dataMap); genericMgr.FlushSession(); #endregion #region Job运行后处理 AfterJobRunSuccess(runLog, tobeFiredTrigger); #endregion } catch (Exception ex) { AfterJobRunFail(runLog, tobeFiredTrigger, ex); } finally { #region 更新BatchTrigger UpdateTrigger(tobeFiredTrigger); #endregion } } //); } else { log.Info("No job found may run in this batch."); } log.Info("BatchJobs run end."); } }
private void AfterJobRunSuccess(RunLog runLog, Trigger tobeFiredTrigger) { log.Info("Job run successful. JobCode:" + tobeFiredTrigger.JobDetail.Code + ", JobName:" + tobeFiredTrigger.JobDetail.Description); genericMgr.ExecuteUpdateWithCustomQuery("update from RunLog set EndTime = ?, Status = ? where Id = ?", new object[] { DateTime.Now, CodeMaster.JobRunStatus.Success, runLog.Id }); genericMgr.FlushSession(); }
private void AfterJobRunFail(RunLog runLog, Trigger tobeFiredTrigger, Exception ex) { try { log.Error("Job run failure. JobCode:" + tobeFiredTrigger.JobDetail.Code + ", JobName:" + tobeFiredTrigger.JobDetail.Description, ex); if (ex.Message != null && ex.Message.Length > 1000) { genericMgr.ExecuteUpdateWithCustomQuery("update from RunLog set EndTime = ?, Status = ?, Message = ? where Id = ?", new object[] { DateTime.Now, CodeMaster.JobRunStatus.Failure, ex.Message.Substring(0, 1000), runLog.Id }); } else { genericMgr.ExecuteUpdateWithCustomQuery("update from RunLog set EndTime = ?, Status = ?, Message = ? where Id = ?", new object[] { DateTime.Now, CodeMaster.JobRunStatus.Failure, ex.Message, runLog.Id }); } } catch (Exception ex1) { log.Error(ex1.Message, ex1); } }
private void BeforeJobRun(RunLog runLog, Trigger tobeFiredTrigger) { log.Info("Start run job. JobCode:" + tobeFiredTrigger.JobDetail.Code + ", JobName:" + tobeFiredTrigger.JobDetail.Description); runLog.JobCode = tobeFiredTrigger.JobDetail.Code; runLog.TriggerName = tobeFiredTrigger.Name; runLog.StartTime = DateTime.Now; runLog.Status = CodeMaster.JobRunStatus.InProcess; genericMgr.Create(runLog); genericMgr.FlushSession(); }