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);
        }
Exemple #2
0
 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
     });
 }