DACTask CreateInstantDACTask(string tid, uint dtuId, IList <uint> sensors, TaskResultConsumer consumer, bool activeFromDB) { if (DtuType == Model.DtuType.Com) { Log.ErrorFormat("COM dtu doesn't support instance task."); return(null); } DACTask task = null; if (activeFromDB) { if (HasUnfinishedTask(dtuId, out task)) { return(task); } } else { if (!_dtus.ContainsKey(dtuId)) { return(null); } task = new DACTask(tid, dtuId, sensors, TaskType.INSTANT, null); DACTaskPersistent.SaveTaskImmedate(task); _rtasks[dtuId] = task; } return(task); }
public DACTask(string tid, uint dtuId, IList <uint> sensors, TaskType type, TaskResultConsumer tc, int taaskid = 0) { this.TID = tid; this.DtuID = dtuId; this.Type = type; this.Sensors = sensors; this.Requested = System.DateTime.Now; this.Requester = "Admin"; this.Saved = false; this.Status = DACTaskStatus.RUNNING; this.Consumer = tc; this.ID = taaskid; }
/// <summary> /// 处理 即时采集任务 /// </summary> /// <param name="tid"></param> /// <param name="dtuId">要采集的DTU</param> /// <param name="sensors">要采集的传感器,为空或Count=0时,指全部传感器。</param> /// <param name="consumer"></param> /// <param name="reactive">从数据库重新激活任务,默认=false</param> /// <returns> -1 </returns> public int ArrangeInstantTask(string tid, uint dtuId, IList <uint> sensors, TaskResultConsumer consumer, bool activeFromDB = false) { DtuNode dtu = null; DACTask task = CreateInstantDACTask(tid, dtuId, sensors, consumer, activeFromDB); if (task == null) { return(-1); //无法创建任务. } dtu = _dtus[dtuId]; bool ScheduleStarted = true; if (_schedule == null) { CreateSchedule(_dtus.Count); ScheduleStarted = false; } // Arrange an instant task to schedule string jobKey = GetJobKey(dtuId); JobKey jk = new JobKey(jobKey, JobGroup); if (_schedule.GetJobDetail(jk) != null) { Log.DebugFormat("Task already exist? {0}", jk); return(-1); } IJobDetail job = JobBuilder.Create <DTUDacJob>() .WithIdentity(jobKey, JobGroup) .Build(); AssignJobInfo(this, TaskType.INSTANT, job, tid, dtu, sensors, consumer, task.ID); ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(string.Format("{0}{1}", InstantTrigger, dtu.DtuId), JobGroup) .WithSimpleSchedule(x => x .WithIntervalInSeconds(5000) .WithRepeatCount(1)) .StartNow() //.StartAt(DateBuilder.NextGivenMinuteDate(null, 10)) .Build(); _schedule.ScheduleJob(job, trigger); Console.WriteLine("Add job {1} {0}", DateTime.Now, job.Key.Name); if (!ScheduleStarted) { _schedule.Start(); } Log.DebugFormat("Instance DAC Job created: {0}, task.ID={1}", jobKey, task.ID); //try //{ // _schedule.TriggerJob(jk); //} //catch (Exception ex) //{ // OnInstantTaskFinished(new FailedDACTaskResult(Errors.ERR_NOT_CONNECTED) // { // Task = task, // Finished = DateTime.Now // }); // Log.Error(ex.Message); //} return(task.ID); }
private static void AssignJobInfo(WorkFinder finder, TaskType type, IJobDetail job, string tid, DtuNode dtu, IList <uint> sensors, TaskResultConsumer consumer, int taskid = 0) { job.JobDataMap.Put("INFO", new JobInfo { Finder = finder, Type = type, TID = tid, Dtu = dtu, Sensors = sensors, Consumer = consumer, ID = taskid }); }