mirror of
https://github.com/KevinWG/OSS.Common.git
synced 2026-10-29 06:06:52 +08:00
添加基础任务相关接口
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace OSS.Common.Interfaces.Job
|
||||
{
|
||||
/// <summary>
|
||||
/// 任务 提供者 接口
|
||||
/// </summary>
|
||||
public interface IJobExecutor
|
||||
{
|
||||
/// <summary>
|
||||
/// 开始任务
|
||||
/// </summary>
|
||||
void StartJob();
|
||||
|
||||
/// <summary>
|
||||
/// 结束任务
|
||||
/// </summary>
|
||||
void StopJob();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user