Beispiel #1
0
 /// <summary>
 /// 添加一个采集执行者,当该页面不存在时
 /// </summary>
 /// <param name="collectTaskInvoker"></param>
 /// <returns></returns>
 public bool AddWhereNotExists(CollectTaskInvoker collectTaskInvoker)
 {
     return(this._lock.SafeSetValue(item =>
     {
         var uri = item.Uri.ToString();
         if (!this._dic.ContainsKey(uri))
         {
             this._dic.Add(uri, collectTaskInvoker);
             return true;
         }
         return false;
     }, collectTaskInvoker));
 }
Beispiel #2
0
        /// <summary>
        /// 开始采集
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <param name="collectInfo"></param>
        public void Start(CancellationToken cancellationToken, CollectInfo collectInfo)
        {
            this._collect = collectInfo;

            // 重置任务状态
            this._collectTaskDal.Update(collectInfo.Id, CollectTaskStatus.Running, CollectTaskStatus.None);
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            // 执行初始化脚本,不做异常捕获,发生异常直接退出
            using (var initInvoker = new CollectTaskInvoker(this.State))
            {
                initInvoker.Invoke(collectInfo, null);
            }
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            // 循环执行
            while (true)
            {
                // 取消执行,等待其他任务结束
                if (cancellationToken.IsCancellationRequested)
                {
                    if (this.State.RunningTaskCount > 0)
                    {
                        Thread.Sleep(500);
                        continue;
                    }
                    return;
                }

                // 请求执行
                this._sh.WaitOne();
                var taskInfo = this._collectTaskDal.SelectSingle(collectInfo.Id, CollectTaskStatus.None);
                if (taskInfo == null)
                {
                    taskInfo = this._collectTaskDal.SelectSingle(collectInfo.Id, CollectTaskStatus.Error);
                }
                // 获取不到,等待其他任务结束
                if (taskInfo == null)
                {
                    if (this.State.RunningTaskCount > 0)
                    {
                        Thread.Sleep(500);
                        this._sh.Release();
                        continue;
                    }
                    return;
                }
                taskInfo.Status = CollectTaskStatus.Running;
                taskInfo.RetryCount++;
                this._collectTaskDal.Update(taskInfo);

                // 发起新线程,执行任务
                Task.Factory.StartNew((objTask) =>
                {
                    this.State.RunningTaskCount = 1;
                    CollectTaskInvoker invoker  = null;
                    var refTask    = objTask as CollectTaskInfo;
                    var invokeArgs = new CollectTaskInvokeCompleteArgs()
                    {
                        Task = refTask
                    };
                    try
                    {
                        invoker = this._lock.SafeReadValue(() =>
                        {
                            if (this._invokers.Count > 0)
                            {
                                return(this._invokers.Dequeue());
                            }
                            return(new CollectTaskInvoker(this.State));
                        });
                        invoker.Invoke(this._collect, refTask);
                        refTask.Status = CollectTaskStatus.Complete;
                        this._collectTaskDal.Update(refTask);
                        invokeArgs.Success = true;
                    }
                    catch (Exception ex)
                    {
                        refTask.Status = CollectTaskStatus.Error;
                        if (refTask.RetryCount >= this._retry)
                        {
                            refTask.Status = CollectTaskStatus.Faild;
                        }
                        this._collectTaskDal.Update(refTask);
                        invokeArgs.Success = false;
                        invokeArgs.Error   = ex;
                    }
                    finally
                    {
                        // 单个任务执行结束
                        if (invoker != null)
                        {
                            this._lock.SafeSetValue(t => this._invokers.Enqueue(t), invoker);
                        }
                        if (invokeArgs.Success)
                        {
                            this.State.CompleteTaskCount = 1;
                        }
                        else
                        {
                            this.State.ErrorTaskCount = 1;
                        }
                        this.OnCollectTaskInvokeComplete?.Invoke(this, invokeArgs);
                        this.State.RunningTaskCount = -1;
                        this._sh.Release();
                    }
                }, taskInfo);
            }
        }