/// <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); }
/// <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); }
/// <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); }
/// <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 { } } }
/// <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 { } } }
/// <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); }