//执行任务 private void RunTask() { cPlanRunLog rLog = new cPlanRunLog(); rLog.OpenLogFile(); while (m_runningTasks.Count > 0) { cTaskPlan tp = m_runningTasks.Dequeue(); switch (tp.RunTaskType) { case (int)cGlobalParas.RunTaskType.SoukeyTask: RunSoukeyTask(tp.RunTaskName); break; case (int)cGlobalParas.RunTaskType.OtherTask: RunOtherTask(tp.RunTaskName, tp.RunTaskPara); break; case (int)cGlobalParas.RunTaskType.DataTask: RunDataTask(tp.RunTaskName, tp.RunTaskPara); break; } //写日志 rLog.InsertLog(cGlobalParas.LogType.RunPlanTask, tp.PlanID, tp.PlanName, (cGlobalParas.RunTaskType)tp.RunTaskType, tp.RunTaskName, tp.RunTaskPara); } rLog.CloseLogFile(); rLog = null; }
//处理触发器的执行事件 private void TriggerRun() { //无论失败还是成功都要进行触发器的触发 if (m_pTaskData.IsTrigger == true && m_pTaskData.TriggerType == ((int)cGlobalParas.TriggerType.PublishedRun).ToString()) { cRunTask rt = new cRunTask(); rt.RunSoukeyTaskEvent += this.onRunSoukeyTask; cTaskPlan p; for (int i = 0; i < m_pTaskData.TriggerTask.Count; i++) { p = new cTaskPlan(); p.RunTaskType = m_pTaskData.TriggerTask[i].RunTaskType; p.RunTaskName = m_pTaskData.TriggerTask[i].RunTaskName; p.RunTaskPara = m_pTaskData.TriggerTask[i].RunTaskPara; rt.AddTask(p); } rt.RunSoukeyTaskEvent -= this.onRunSoukeyTask; rt = null; } }
//定期由外部调用 //检测需要执行的任务,如果需要执行,则把任务 //压到执行的任务队列中 public void CheckPlan() { //重新加载计划期间禁止运行计划检测操作 if (m_IsReloading == false) { cTaskPlan tPlan; for (int i = 0; i < m_runTasks.Count; i++) { //无效的计划不进行判断,计划的状态由执行时进行维护 if (m_runTasks[i].PlanState == (int)cGlobalParas.PlanState.Enabled) { if (DateTime.Compare(DateTime.Now, DateTime.Parse(m_runTasks[i].EnabledDateTime)) < 0) { //表示还未到生效时间,不启用此任务的检测 continue; } if (m_runTasks[i].PlanRunTime == "" || m_runTasks[i].PlanRunTime == null) { m_runTasks[i].PlanRunTime = m_runTasks[i].NextRunTime; } else { double douTime = TimeSpan.Parse(DateTime.Now.Subtract(DateTime.Parse(m_runTasks[i].PlanRunTime)).ToString()).TotalSeconds; //表示下次运行的时间已经到了,但还未超过5分钟,如果超过5分钟,则默认系统没有执行此任务 //是否再次执行由配置参数决定:IsOverRun if (douTime > 0 && douTime < 300) { //将任务压入任务队列 for (int j = 0; j < m_runTasks[i].RunTasks.Count; j++) { //在此需要重新初始化执行任务的数据,主要是要增加计划的ID和计划的名称 tPlan = new cTaskPlan(); tPlan.PlanID = m_runTasks[i].PlanID.ToString(); tPlan.PlanName = m_runTasks[i].PlanName; tPlan.RunTaskType = m_runTasks[i].RunTasks[j].RunTaskType; tPlan.RunTaskName = m_runTasks[i].RunTasks[j].RunTaskName; tPlan.RunTaskPara = m_runTasks[i].RunTasks[j].RunTaskPara; e_AddRunTaskEvent(this, new cAddRunTaskEventArgs(tPlan)); } m_runTasks[i].PlanRunTime = m_runTasks[i].NextRunTime; } } } } } }
/// 当某个线程采集完成后,会调用任务完成事件进行检测,如果任务完成则触发任务 /// 完成事件。但在此判断时需要注意,如果任务采集失败的数量和采集数量相等,则判断 /// 任务失败。且每次调用此事件时,都需要做一次检测,对每个子线程都检测一遍,看是否 /// 存在已经完成,但未触发完成事件的自线程。 private void onTaskCompleted() { if (m_TaskData.UrlCount == (m_TaskData.GatheredUrlCount + m_TaskData.GatherErrUrlCount) && m_State != cGlobalParas.TaskState.Completed) { if (m_TaskData.TrueUrlCount == m_TaskData.GatherErrUrlCount) { //如果全部采集都发生了错误,则此任务为失败 State = cGlobalParas.TaskState.Failed; } else { // 设置为完成状态,触发任务完成事件 State = cGlobalParas.TaskState.Completed; } //无论失败还是成功都要进行触发器的触发 if (m_TaskData.IsTrigger == true && m_TaskData.TriggerType == ((int)cGlobalParas.TriggerType.GatheredRun).ToString()) { cRunTask rt = new cRunTask(); rt.RunSoukeyTaskEvent += this.onRunSoukeyTask; cTaskPlan p; for (int i = 0; i < m_TaskData.TriggerTask.Count; i++) { p = new cTaskPlan(); p.RunTaskType = m_TaskData.TriggerTask[i].RunTaskType; p.RunTaskName = m_TaskData.TriggerTask[i].RunTaskName; p.RunTaskPara = m_TaskData.TriggerTask[i].RunTaskPara; rt.AddTask(p); } rt.RunSoukeyTaskEvent -= this.onRunSoukeyTask; rt = null; } } }
public void AddTask(cTaskPlan task) { m_runningTasks.Enqueue(task); RunTask(); }
public cAddRunTaskEventArgs(cTaskPlan RTask) { m_RunTask = RTask; }
private Int64 SaveTaskPlan() { cPlan NewPlan = new cPlan(); Int64 Nid = GetNewID(); if (Nid == 0) { throw new cSoukeyException(rm.GetString("Error21")); } NewPlan.PlanID = Nid; NewPlan.PlanName = this.txtPlanName.Text; NewPlan.PlanRemark = this.txtPlanDemo.Text; //系统自动判断当前任务的状态 if (this.cboxIsDisabled.Checked == true) { if (this.raNumber.Checked == true) { if (this.DisabledRunNum.Value == 1 && DateTime.Compare(DateTime.Now, this.RunOnceTime.Value) > 0) { NewPlan.PlanState = (int)cGlobalParas.PlanState.Disabled; } else { NewPlan.PlanState = (int)cGlobalParas.PlanState.Enabled; } } else if (this.raDateTime.Checked == true) { if (DateTime.Compare(DateTime.Now, this.DisabledDateTime.Value) < 0) { NewPlan.PlanState = (int)cGlobalParas.PlanState.Disabled; } else { NewPlan.PlanState = (int)cGlobalParas.PlanState.Enabled; } } } else { NewPlan.PlanState = (int)cGlobalParas.PlanState.Enabled; } if (this.cboxIsRun.Checked == true) { NewPlan.IsOverRun = true; } else { NewPlan.IsOverRun = false; } if (this.cboxIsDisabled.Checked == true) { NewPlan.IsDisabled = true; } else { NewPlan.IsDisabled = false; } if (this.raNumber.Checked == true) { NewPlan.DisabledType = (int)cGlobalParas.PlanDisabledType.RunTime; } else if (this.raDateTime.Checked == true) { NewPlan.DisabledType = (int)cGlobalParas.PlanDisabledType.RunDateTime; } NewPlan.DisabledTime = int.Parse(this.DisabledRunNum.Value.ToString()); NewPlan.DisabledDateTime = this.DisabledDateTime.Value; cTaskPlan tp; for (int i = 0; i < this.listTask.Items.Count; i++) { tp = new cTaskPlan(); tp.RunTaskType = cGlobalParas.ConvertID(this.listTask.Items[i].Text); if (cGlobalParas.ConvertID(this.listTask.Items[i].Text) == (int)cGlobalParas.RunTaskType.DataTask) { tp.RunTaskName = cGlobalParas.ConvertID(this.listTask.Items[i].SubItems[1].Text.ToString()).ToString(); } else { tp.RunTaskName = this.listTask.Items[i].SubItems[1].Text.ToString(); } tp.RunTaskPara = this.listTask.Items[i].SubItems[2].Text.ToString(); NewPlan.RunTasks.Add(tp); } if (this.raOneTime.Checked == true) { NewPlan.RunTaskPlanType = (int)cGlobalParas.RunTaskPlanType.Ones; } else if (this.raDay.Checked == true) { if (this.raRunones.Checked == true) { NewPlan.RunTaskPlanType = (int)cGlobalParas.RunTaskPlanType.DayOnes; } else if (this.raRuntwice.Checked == true) { NewPlan.RunTaskPlanType = (int)cGlobalParas.RunTaskPlanType.DayTwice; } } else if (this.raWeekly.Checked == true) { NewPlan.RunTaskPlanType = (int)cGlobalParas.RunTaskPlanType.Weekly; } else if (this.raCustom.Checked == true) { NewPlan.RunTaskPlanType = (int)cGlobalParas.RunTaskPlanType.Custom; } NewPlan.EnabledDateTime = this.EnabledDate.Value.ToLongDateString(); NewPlan.RunOnesTime = this.RunOnceTime.Value.ToString(); NewPlan.RunDayTime = this.RunDayOnesTime.Value.ToLongTimeString(); NewPlan.RunAMTime = this.RunDayTwice1Time.Value.ToLongTimeString(); NewPlan.RunPMTime = this.RunDayTwice2Time.Value.ToLongTimeString(); NewPlan.RunWeeklyTime = this.RunWeeklyTime.Value.ToLongTimeString(); NewPlan.FirstRunTime = this.FirstRunTime.Value.ToLongTimeString(); NewPlan.RunInterval = this.udRunInterval.Value.ToString(); string runWeekly = ""; if (this.cboxSunday.Checked == true) { runWeekly = "0"; } if (this.cboxMonday.Checked == true) { runWeekly += ",1"; } if (this.cboxTuesday.Checked == true) { runWeekly += ",2"; } if (this.cboxWednesday.Checked == true) { runWeekly += ",3"; } if (this.cboxThursday.Checked == true) { runWeekly += ",4"; } if (this.cboxFriday.Checked == true) { runWeekly += ",5"; } if (this.cboxSturday.Checked == true) { runWeekly += ",6"; } NewPlan.RunWeekly = runWeekly; cPlans p = new cPlans(); if (this.FormState == cGlobalParas.FormState.New) { p.InsertPlan(NewPlan); } else if (this.FormState == cGlobalParas.FormState.Edit) { p.EditPlan(NewPlan); } p = null; return(Nid); }
//加载计划,加载计划的时候需要对计划的状态进行维护 private void IniCheckPlan() { try { cXmlIO xmlConfig = new cXmlIO(Program.getPrjPath() + "tasks\\plan\\plan.xml"); DataView d = xmlConfig.GetData("descendant::Plans"); if (d == null) { return; } cPlan p; for (int i = 0; i < d.Count; i++) { p = new cPlan(); if (int.Parse(d[i].Row["PlanState"].ToString()) == (int)cGlobalParas.PlanState.Enabled) { p.PlanID = Int64.Parse(d[i].Row["ID"].ToString()); p.PlanName = d[i].Row["PlanName"].ToString(); p.PlanState = int.Parse(d[i].Row["PlanState"].ToString()); p.IsOverRun = d[i].Row["IsOverRun"].ToString() == "True" ? true : false; p.IsDisabled = d[i].Row["IsDisabled"].ToString() == "True" ? true : false; p.DisabledType = int.Parse(d[i].Row["DisabledType"].ToString()); p.DisabledTime = int.Parse(d[i].Row["DisabledTime"].ToString()); p.DisabledDateTime = DateTime.Parse(d[i].Row["DisabledDateTime"].ToString()); p.RunTaskPlanType = int.Parse(d[i].Row["RunTaskPlanType"].ToString()); p.EnabledDateTime = d[i].Row["EnabledDateTime"].ToString(); p.RunOnesTime = d[i].Row["RunOnesTime"].ToString(); p.RunDayTime = d[i].Row["RunDayTime"].ToString(); p.RunAMTime = d[i].Row["RunAMTime"].ToString(); p.RunPMTime = d[i].Row["RunPMTime"].ToString(); p.RunWeeklyTime = d[i].Row["RunWeeklyTime"].ToString(); p.RunWeekly = d[i].Row["RunWeekly"].ToString(); p.RunTimeCount = d[i].Row["RunTimeCount"].ToString(); p.FirstRunTime = d[i].Row["FirstRunTime"].ToString(); p.RunInterval = d[i].Row["RunInterval"].ToString(); cTaskPlan tp; DataView t = d[i].CreateChildView("Plan_Tasks")[0].CreateChildView("Tasks_Task"); for (int j = 0; j < t.Count; j++) { tp = new cTaskPlan(); tp.RunTaskType = int.Parse(t[j].Row["RunTaskType"].ToString()); tp.RunTaskName = t[j].Row["RunTaskName"].ToString(); tp.RunTaskPara = t[j].Row["RunTaskPara"].ToString(); p.RunTasks.Add(tp); } m_runTasks.Add(p); } } p = null; xmlConfig = null; //自动维护计划状态 AutoState(); } catch (System.Exception ex) { throw ex; } }