添加基础任务相关接口

This commit is contained in:
LongX
2019-01-24 15:35:40 +08:00
parent f854b708d4
commit 2f411e253a
3 changed files with 223 additions and 0 deletions
@@ -0,0 +1,88 @@
using System.Collections.Generic;
namespace OSS.Common.Interfaces.Job
{
/// <summary>
/// 列表循环处理任务执行
/// 从 GetExcuteSource() 获取执行数据源,循环并通过 ExcuteItem() 执行个体任务,直到没有数据源返回
/// 如果执行时间过长,重复触发时 当前任务还在进行中,则不做任何处理
/// </summary>
public abstract class BaseListJobExcutor<IType> : IJobExecutor
{
/// <summary>
/// 运行状态
/// </summary>
public bool IsRuning { get; protected set; }
private int triggerTimes { get; set; } = 0;
/// <summary>
/// 开始任务
/// </summary>
public void StartJob()
{
// 任务依然在执行中,不需要再次唤起
if (IsRuning)
return;
IsRuning = true;
IList<IType> list = null; // 结清实体list
OnBegin(triggerTimes++);
do
{
for (var i = 0; IsRuning && i < list?.Count; i++)
{
ExcuteItem(list[i], i);
}
list = GetExcuteSource();
} while (IsRuning && list?.Count > 0);
OnEnd(triggerTimes);
IsRuning = false;
}
/// <summary>
/// 获取list数据源
/// </summary>
/// <returns></returns>
protected virtual IList<IType> GetExcuteSource()
{
return null;
}
/// <summary>
/// 个体任务执行
/// </summary>
/// <param name="item">单个实体</param>
/// <param name="index">在数据源中的索引</param>
protected virtual void ExcuteItem(IType item, int index)
{
}
/// <summary>
/// 结束任务
/// </summary>
public void StopJob()
{
IsRuning = false;
}
/// <summary>
/// 此轮任务开始
/// </summary>
protected virtual void OnBegin(int triggerTimes)
{
}
/// <summary>
/// 此轮任务结束
/// </summary>
protected virtual void OnEnd(int triggerTimes)
{
}
}
}
@@ -0,0 +1,117 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using OSS.Common.Plugs.LogPlug;
namespace OSS.Common.Interfaces.Job
{
/// <summary>
/// 定时器基础类
/// </summary>
public class BaseTimerTrigger:IDisposable
{
private Timer _timer;
private readonly TimeSpan _dueTime;
private readonly TimeSpan _periodTime;
private readonly IJobExecutor _jobExcutor;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dueTime">到期开始执行时间</param>
/// <param name="periodTime">间隔时间</param>
/// <param name="jobExcutor">任务执行者</param>
protected BaseTimerTrigger(TimeSpan dueTime, TimeSpan periodTime, IJobExecutor jobExcutor)
{
_dueTime = dueTime;
_periodTime = periodTime;
_jobExcutor = jobExcutor;
}
#region 基础方法
/// <summary>
/// 配置并触发定时器
/// </summary>
/// <returns></returns>
private void StartTimerTrigger()
{
if (_timer == null)
_timer = new Timer(ExcuteJob, _jobExcutor, _dueTime, _periodTime);
else
_timer.Change(_dueTime, _periodTime);
}
/// <summary>
/// 停止定时器
/// </summary>
private void StopTimerTrigger()
{
_timer?.Change(Timeout.Infinite, Timeout.Infinite);
}
/// <inheritdoc />
public void Dispose()
{
_timer?.Dispose();
}
#endregion
/// <summary>
/// 系统级任务执行启动
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual Task StartAsync(CancellationToken cancellationToken)
{
try
{
StartTimerTrigger();
}
catch (Exception e)
{
LogUtil.Error($"启动定时任务({nameof(GetType)})时出错,信息:{e}", string.Empty, "System_TimerJob");
}
return Task.CompletedTask;
}
/// <summary>
/// 系统级任务执行关闭
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public virtual Task StopAsync(CancellationToken cancellationToken)
{
try
{
_jobExcutor.StopJob();
StopTimerTrigger();
}
catch (Exception e)
{
LogUtil.Error($"停止定时任务({nameof(GetType)})时出错,信息:{e}", String.Empty, "System_TimerJob");
}
return Task.CompletedTask;
}
private void ExcuteJob(object obj)
{
try
{
var excutor = obj as IJobExecutor;
excutor?.StartJob();
}
catch (Exception e)
{
LogUtil.Error($"执行任务({nameof(GetType)})时出错,信息:{e}", String.Empty, "System_TimerJob");
}
}
}
}
+18
View File
@@ -0,0 +1,18 @@
namespace OSS.Common.Interfaces.Job
{
/// <summary>
/// 任务 提供者 接口
/// </summary>
public interface IJobExecutor
{
/// <summary>
/// 开始任务
/// </summary>
void StartJob();
/// <summary>
/// 结束任务
/// </summary>
void StopJob();
}
}