예제 #1
0
        /// <summary>
        /// 获取一个新的采集任务,如果当前繁忙,此方法将会等待
        /// </summary>
        /// <returns></returns>
        private TaskInvoker NewInvoker()
        {
            var item = TaskInvokerStorage.Instance.Get(this.TaskId);

            if (item == null)
            {
                return(null);
            }
            var settings = new TaskItemSetting()
            {
                ScriptFile      = System.IO.Path.Combine(this.Context.ExecutePath, item.Script),
                Url             = item.Url,
                TaskInvokerInfo = item
            };

            this._lock.WaitOne();
            TaskInvoker invoker = null;

            lock (this)
            {
                if (this._freeSE.Count > 0)
                {
                    invoker = this._freeSE.Dequeue();
                }
                if (invoker == null)
                {
                    invoker = new TaskInvoker(this.Context);
                    this._count++;
                }
            }
            invoker.SetSetting(settings);
            Interlocked.Increment(ref this._busyCount);
            return(invoker);
        }
예제 #2
0
        /// <summary>
        /// 执行任务
        /// </summary>
        internal void Run()
        {
            Init();

            if (Status != TaskStatus.Init)
            {
                return;
            }
            lock (LockObj)
            {
                if (Status != TaskStatus.Init)
                {
                    return;
                }
                Status = TaskStatus.Running;
            }

            new Thread(() =>
            {
                // 绑定任务执行上下文
                this.Context.BindContext();

                while (true)
                {
                    var isStop = false;
                    lock (this)
                    {
                        isStop = this.Status == TaskStatus.Stopping;
                    }
                    // 获取执行者
                    TaskInvoker invoker = isStop ? null : NewInvoker();
                    if (invoker == null)
                    {
                        if (SetStop())
                        {
                            OnStop?.Invoke(this, null);
                            break;
                        }
                        Thread.Sleep(1000);
                        continue;
                    }
                    invoker.RunAsync((task) =>
                    {
                        // 释放执行者
                        FreeInvoker(task);
                    });
                }
            }).Start();

            OnStart?.Invoke(this, null);
        }
예제 #3
0
 /// <summary>
 /// 获取一个新的采集任务,如果当前繁忙,此方法将会等待
 /// </summary>
 /// <returns></returns>
 private TaskInvoker NewInvoker()
 {
     try
     {
         var item = TaskItems.Instance.GetExec(this.TaskId);
         if (item == null)
         {
             return(null);
         }
         var settings = new TaskItemSetting()
         {
             ScriptFile      = System.IO.Path.Combine(this.ExecutePath, item.Script),
             Url             = item.Url,
             TaskInvokerInfo = item
         };
         this._lock.WaitOne();
         TaskInvoker invoker = null;
         lock (this)
         {
             if (this._freeSE.Count > 0)
             {
                 invoker = this._freeSE.Dequeue();
             }
             if (invoker == null)
             {
                 invoker = new TaskInvoker(this);
                 this._count++;
             }
         }
         invoker.SetSetting(settings);
         Interlocked.Increment(ref this._busyCount);
         return(invoker);
     }
     catch (Exception ex)
     {
         LoggerProxy.Error(LogSource, "call NewInvoker failed.", ex);
     }
     return(null);
 }
예제 #4
0
 /// <summary>
 /// 释放一个任务执行者
 /// </summary>
 /// <param name="invoker"></param>
 private void FreeInvoker(TaskInvoker invoker)
 {
     try
     {
         if (invoker.Result != null)
         {
             // 设置任务状态
             if (invoker.Result.TaskInvokerInfo != null)
             {
                 invoker.Result.TaskInvokerInfo.Status = invoker.Result.Success ? 3 :
                                                         invoker.Result.TaskInvokerInfo.ExecCount >= ConfigManager.Current.ErrorRetry ? 4 : 2;
                 if (!TaskItems.Instance.Update(invoker.Result.TaskInvokerInfo))
                 {
                     LoggerProxy.Error(LogSource, "update callInvoker status failed.");
                 }
                 // 新增统计信息
                 this.SetStat(1, invoker.Result.Success ? TaskStatTypes.Task : TaskStatTypes.ErrTask);
             }
         }
     }
     catch (Exception ex)
     {
         LoggerProxy.Error(LogSource, "call FreeInvoker failed.", ex);
     }
     finally
     {
         try
         {
             Interlocked.Decrement(ref this._busyCount);
             lock (this)
             {
                 this._freeSE.Enqueue(invoker);
                 this._lock.Release();
             }
         }
         catch { }
     }
 }
예제 #5
0
        /// <summary>
        /// 释放一个任务执行者
        /// </summary>
        /// <param name="invoker"></param>
        private void FreeInvoker(TaskInvoker invoker)
        {
            try
            {
                if (invoker.Result != null)
                {
                    // 设置任务状态
                    if (invoker.Result.TaskInvoker != null)
                    {
                        invoker.Result.TaskInvoker.Status = invoker.Result.Success ? 3 : 2;
                        if (!TaskInvokerStorage.Instance.Update(invoker.Result.TaskInvoker))
                        {
                            // todo: 记录日志
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // todo: 写入日志
            }
            finally
            {
                try
                {
                    Interlocked.Decrement(ref this._busyCount);
                    lock (this)
                    {
                        this._freeSE.Enqueue(invoker);

                        this._lock.Release();
                    }
                }
                catch { }
            }
        }
예제 #6
0
        /// <summary>
        /// 执行任务
        /// </summary>
        internal bool Run()
        {
            Init();
            if (Status != TaskStatus.Init)
            {
                return(false);
            }
            lock (LockObj)
            {
                if (Status != TaskStatus.Init)
                {
                    return(false);
                }
                Status = TaskStatus.Running;
            }

            new Thread(() =>
            {
                try
                {
                    while (true)
                    {
                        var isStop = false;
                        lock (this)
                        {
                            isStop = this.Status == TaskStatus.Stopping;
                        }
                        // 获取执行者
                        TaskInvoker invoker = isStop ? null : NewInvoker();
                        if (invoker == null)
                        {
                            if (SetStop())
                            {
                                OnStop?.Invoke(this, new TaskEventArgs()
                                {
                                    Task = this
                                });
                                this.Free();
                                break;
                            }
                            Thread.Sleep(1000);
                            continue;
                        }
                        invoker.RunAsync((task) =>
                        {
                            // 释放执行者
                            FreeInvoker(task);
                        });
                    }
                }
                catch (Exception ex)
                {
                    LoggerProxy.Error(LogSource, "call Run error.", ex);
                    OnError?.Invoke(this, new TaskErrorEventArgs()
                    {
                        Ex   = ex,
                        Task = this
                    });
                }
            }).Start();
            OnStart?.Invoke(this, new TaskEventArgs()
            {
                Task = this
            });
            return(true);
        }