v4.0 版本是对v3版本的重构,主要是为了解决v3版本的一些问题,以及提供更多的功能

This commit is contained in:
大石头 2024-04-22 14:33:15 +08:00
parent b6f65740a4
commit 723f05c7af
6 changed files with 140 additions and 19 deletions

View File

@ -865,6 +865,17 @@
<td>定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑</td>
</tr>
<tr>
<td>Cron</td>
<td>执行频次</td>
<td>String</td>
<td>50</td>
<td></td>
<td></td>
<td></td>
<td>定时调度的Cron表达式</td>
</tr>
<tr>
<td>Topic</td>
<td>主题</td>
@ -895,7 +906,7 @@
<td></td>
<td></td>
<td></td>
<td>大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</td>
<td>从该时间开始调度作业任务,默认不设置时从当前时间开始</td>
</tr>
<tr>
@ -906,7 +917,7 @@
<td></td>
<td></td>
<td></td>
<td>小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用</td>
<td>到该时间停止调度作业,默认不设置时永不停止</td>
</tr>
<tr>
@ -1019,6 +1030,17 @@
<td>默认60秒出错延迟后重新发放</td>
</tr>
<tr>
<td>Deadline</td>
<td>最后期限</td>
<td>DateTime</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>超过该时间后,任务将不再执行</td>
</tr>
<tr>
<td>Total</td>
<td>总数</td>
@ -1085,6 +1107,28 @@
<td></td>
</tr>
<tr>
<td>LastStatus</td>
<td>最后一次状态</td>
<td>Int32</td>
<td></td>
<td></td>
<td></td>
<td>N</td>
<td></td>
</tr>
<tr>
<td>LastTime</td>
<td>最后一次时间</td>
<td>DateTime</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Data</td>
<td>数据</td>

View File

@ -70,6 +70,14 @@ public partial class Job
[BindColumn("Mode", "调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑", "")]
public JobModes Mode { get => _Mode; set { if (OnPropertyChanging("Mode", value)) { _Mode = value; OnPropertyChanged("Mode"); } } }
private String _Cron;
/// <summary>执行频次。定时调度的Cron表达式</summary>
[DisplayName("执行频次")]
[Description("执行频次。定时调度的Cron表达式")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Cron", "执行频次。定时调度的Cron表达式", "")]
public String Cron { get => _Cron; set { if (OnPropertyChanging("Cron", value)) { _Cron = value; OnPropertyChanged("Cron"); } } }
private String _Topic;
/// <summary>主题。消息调度时消费的主题</summary>
[DisplayName("主题")]
@ -87,19 +95,19 @@ public partial class Job
public Int32 MessageCount { get => _MessageCount; set { if (OnPropertyChanging("MessageCount", value)) { _MessageCount = value; OnPropertyChanged("MessageCount"); } } }
private DateTime _Start;
/// <summary>开始。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
/// <summary>开始。从该时间开始调度作业任务,默认不设置时从当前时间开始</summary>
[DisplayName("开始")]
[Description("开始。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用")]
[Description("开始。从该时间开始调度作业任务,默认不设置时从当前时间开始")]
[DataObjectField(false, false, true, 0)]
[BindColumn("Start", "开始。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用", "")]
[BindColumn("Start", "开始。从该时间开始调度作业任务,默认不设置时从当前时间开始", "")]
public DateTime Start { get => _Start; set { if (OnPropertyChanging("Start", value)) { _Start = value; OnPropertyChanged("Start"); } } }
private DateTime _End;
/// <summary>结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用</summary>
/// <summary>结束。到该时间停止调度作业,默认不设置时永不停止</summary>
[DisplayName("结束")]
[Description("结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用")]
[Description("结束。到该时间停止调度作业,默认不设置时永不停止")]
[DataObjectField(false, false, true, 0)]
[BindColumn("End", "结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用", "")]
[BindColumn("End", "结束。到该时间停止调度作业,默认不设置时永不停止", "")]
public DateTime End { get => _End; set { if (OnPropertyChanging("End", value)) { _End = value; OnPropertyChanged("End"); } } }
private Int32 _Step;
@ -123,7 +131,7 @@ public partial class Job
[DisplayName("偏移")]
[Description("偏移。距离AntServer当前时间的秒数避免因服务器之间的时间误差而错过部分数据秒")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Offset", "偏移。距离AntServer当前时间的秒数避免因服务器之间的时间误差而错过部分数据秒", "")]
[BindColumn("Offset", "偏移。距离AntServer当前时间的秒数避免因服务器之间的时间误差而错过部分数据秒", "", ItemType = "TimeSpan")]
public Int32 Offset { get => _Offset; set { if (OnPropertyChanging("Offset", value)) { _Offset = value; OnPropertyChanged("Offset"); } } }
private Int32 _MaxTask;
@ -182,6 +190,14 @@ public partial class Job
[BindColumn("ErrorDelay", "错误延迟。默认60秒出错延迟后重新发放", "")]
public Int32 ErrorDelay { get => _ErrorDelay; set { if (OnPropertyChanging("ErrorDelay", value)) { _ErrorDelay = value; OnPropertyChanged("ErrorDelay"); } } }
private DateTime _Deadline;
/// <summary>最后期限。超过该时间后,任务将不再执行</summary>
[DisplayName("最后期限")]
[Description("最后期限。超过该时间后,任务将不再执行")]
[DataObjectField(false, false, true, 0)]
[BindColumn("Deadline", "最后期限。超过该时间后,任务将不再执行", "")]
public DateTime Deadline { get => _Deadline; set { if (OnPropertyChanging("Deadline", value)) { _Deadline = value; OnPropertyChanged("Deadline"); } } }
private Int64 _Total;
/// <summary>总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1</summary>
[DisplayName("总数")]
@ -230,6 +246,22 @@ public partial class Job
[BindColumn("Enable", "启用", "")]
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private JobStatus _LastStatus;
/// <summary>最后一次状态</summary>
[DisplayName("最后一次状态")]
[Description("最后一次状态")]
[DataObjectField(false, false, false, 0)]
[BindColumn("LastStatus", "最后一次状态", "")]
public JobStatus LastStatus { get => _LastStatus; set { if (OnPropertyChanging("LastStatus", value)) { _LastStatus = value; OnPropertyChanged("LastStatus"); } } }
private DateTime _LastTime;
/// <summary>最后一次时间</summary>
[DisplayName("最后一次时间")]
[Description("最后一次时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("LastTime", "最后一次时间", "")]
public DateTime LastTime { get => _LastTime; set { if (OnPropertyChanging("LastTime", value)) { _LastTime = value; OnPropertyChanged("LastTime"); } } }
private String _Data;
/// <summary>数据。Sql模板或C#模板</summary>
[DisplayName("数据")]
@ -334,6 +366,7 @@ public partial class Job
"ClassName" => _ClassName,
"DisplayName" => _DisplayName,
"Mode" => _Mode,
"Cron" => _Cron,
"Topic" => _Topic,
"MessageCount" => _MessageCount,
"Start" => _Start,
@ -348,12 +381,15 @@ public partial class Job
"MaxRetain" => _MaxRetain,
"MaxIdle" => _MaxIdle,
"ErrorDelay" => _ErrorDelay,
"Deadline" => _Deadline,
"Total" => _Total,
"Success" => _Success,
"Error" => _Error,
"Times" => _Times,
"Speed" => _Speed,
"Enable" => _Enable,
"LastStatus" => _LastStatus,
"LastTime" => _LastTime,
"Data" => _Data,
"CreateUserID" => _CreateUserID,
"CreateUser" => _CreateUser,
@ -376,6 +412,7 @@ public partial class Job
case "ClassName": _ClassName = Convert.ToString(value); break;
case "DisplayName": _DisplayName = Convert.ToString(value); break;
case "Mode": _Mode = (JobModes)value.ToInt(); break;
case "Cron": _Cron = Convert.ToString(value); break;
case "Topic": _Topic = Convert.ToString(value); break;
case "MessageCount": _MessageCount = value.ToInt(); break;
case "Start": _Start = value.ToDateTime(); break;
@ -390,12 +427,15 @@ public partial class Job
case "MaxRetain": _MaxRetain = value.ToInt(); break;
case "MaxIdle": _MaxIdle = value.ToInt(); break;
case "ErrorDelay": _ErrorDelay = value.ToInt(); break;
case "Deadline": _Deadline = value.ToDateTime(); break;
case "Total": _Total = value.ToLong(); break;
case "Success": _Success = value.ToLong(); break;
case "Error": _Error = value.ToInt(); break;
case "Times": _Times = value.ToInt(); break;
case "Speed": _Speed = value.ToInt(); break;
case "Enable": _Enable = value.ToBoolean(); break;
case "LastStatus": _LastStatus = (JobStatus)value.ToInt(); break;
case "LastTime": _LastTime = value.ToDateTime(); break;
case "Data": _Data = Convert.ToString(value); break;
case "CreateUserID": _CreateUserID = value.ToInt(); break;
case "CreateUser": _CreateUser = Convert.ToString(value); break;
@ -445,16 +485,19 @@ public partial class Job
/// <summary>调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑</summary>
public static readonly Field Mode = FindByName("Mode");
/// <summary>执行频次。定时调度的Cron表达式</summary>
public static readonly Field Cron = FindByName("Cron");
/// <summary>主题。消息调度时消费的主题</summary>
public static readonly Field Topic = FindByName("Topic");
/// <summary>消息数</summary>
public static readonly Field MessageCount = FindByName("MessageCount");
/// <summary>开始。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
/// <summary>开始。从该时间开始调度作业任务,默认不设置时从当前时间开始</summary>
public static readonly Field Start = FindByName("Start");
/// <summary>结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用</summary>
/// <summary>结束。到该时间停止调度作业,默认不设置时永不停止</summary>
public static readonly Field End = FindByName("End");
/// <summary>步进。切分任务的时间区间,秒</summary>
@ -487,6 +530,9 @@ public partial class Job
/// <summary>错误延迟。默认60秒出错延迟后重新发放</summary>
public static readonly Field ErrorDelay = FindByName("ErrorDelay");
/// <summary>最后期限。超过该时间后,任务将不再执行</summary>
public static readonly Field Deadline = FindByName("Deadline");
/// <summary>总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1</summary>
public static readonly Field Total = FindByName("Total");
@ -505,6 +551,12 @@ public partial class Job
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>最后一次状态</summary>
public static readonly Field LastStatus = FindByName("LastStatus");
/// <summary>最后一次时间</summary>
public static readonly Field LastTime = FindByName("LastTime");
/// <summary>数据。Sql模板或C#模板</summary>
public static readonly Field Data = FindByName("Data");
@ -559,16 +611,19 @@ public partial class Job
/// <summary>调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑</summary>
public const String Mode = "Mode";
/// <summary>执行频次。定时调度的Cron表达式</summary>
public const String Cron = "Cron";
/// <summary>主题。消息调度时消费的主题</summary>
public const String Topic = "Topic";
/// <summary>消息数</summary>
public const String MessageCount = "MessageCount";
/// <summary>开始。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
/// <summary>开始。从该时间开始调度作业任务,默认不设置时从当前时间开始</summary>
public const String Start = "Start";
/// <summary>结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用</summary>
/// <summary>结束。到该时间停止调度作业,默认不设置时永不停止</summary>
public const String End = "End";
/// <summary>步进。切分任务的时间区间,秒</summary>
@ -601,6 +656,9 @@ public partial class Job
/// <summary>错误延迟。默认60秒出错延迟后重新发放</summary>
public const String ErrorDelay = "ErrorDelay";
/// <summary>最后期限。超过该时间后,任务将不再执行</summary>
public const String Deadline = "Deadline";
/// <summary>总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1</summary>
public const String Total = "Total";
@ -619,6 +677,12 @@ public partial class Job
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>最后一次状态</summary>
public const String LastStatus = "LastStatus";
/// <summary>最后一次时间</summary>
public const String LastTime = "LastTime";
/// <summary>数据。Sql模板或C#模板</summary>
public const String Data = "Data";

View File

@ -140,13 +140,14 @@
<Column Name="ClassName" DataType="String" Length="100" Description="类名。支持该作业的处理器实现" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Mode" DataType="Int32" Description="调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑" Type="JobModes" />
<Column Name="Cron" DataType="String" Description="执行频次。定时调度的Cron表达式" />
<Column Name="Topic" DataType="String" Description="主题。消息调度时消费的主题" />
<Column Name="MessageCount" DataType="Int32" Description="消息数" />
<Column Name="Start" DataType="DateTime" Description="开始。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用" />
<Column Name="End" DataType="DateTime" Description="结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),默认空表示无止境,消息调度不适用" />
<Column Name="Start" DataType="DateTime" Description="开始。从该时间开始调度作业任务,默认不设置时从当前时间开始" />
<Column Name="End" DataType="DateTime" Description="结束。到该时间停止调度作业,默认不设置时永不停止" />
<Column Name="Step" DataType="Int32" Description="步进。切分任务的时间区间,秒" />
<Column Name="BatchSize" DataType="Int32" Description="批大小。数据调度每次抽取数据的分页大小,或消息调度每次处理的消息数,定时调度不适用" />
<Column Name="Offset" DataType="Int32" Description="偏移。距离AntServer当前时间的秒数避免因服务器之间的时间误差而错过部分数据秒" />
<Column Name="Offset" DataType="Int32" ItemType="TimeSpan" Description="偏移。距离AntServer当前时间的秒数避免因服务器之间的时间误差而错过部分数据秒" />
<Column Name="MaxTask" DataType="Int32" Description="并行度。一共允许多少个任务并行处理,多执行端时平均分配,确保该作业整体并行度" />
<Column Name="MaxError" DataType="Int32" Description="最大错误。连续错误达到最大错误数时停止" />
<Column Name="MaxRetry" DataType="Int32" Description="最大重试。默认10次超过该次数后将不再重试" />
@ -154,12 +155,15 @@
<Column Name="MaxRetain" DataType="Int32" Description="保留。任务项保留天数超过天数的任务项将被删除默认3天" />
<Column Name="MaxIdle" DataType="Int32" Description="最大空闲时间。默认3600秒超过该时间不更新则认为应用程序故障系统触发告警" />
<Column Name="ErrorDelay" DataType="Int32" Description="错误延迟。默认60秒出错延迟后重新发放" />
<Column Name="Deadline" DataType="DateTime" Description="最后期限。超过该时间后,任务将不再执行" />
<Column Name="Total" DataType="Int64" Description="总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1" />
<Column Name="Success" DataType="Int64" Description="成功。成功处理的数据取自于Handler.Execute返回值或者ProcessItem返回true的个数" />
<Column Name="Error" DataType="Int32" Description="错误" />
<Column Name="Times" DataType="Int32" Description="次数" />
<Column Name="Speed" DataType="Int32" Description="速度" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="LastStatus" DataType="Int32" Description="最后一次状态" Type="JobStatus" />
<Column Name="LastTime" DataType="DateTime" Description="最后一次时间" />
<Column Name="Data" DataType="String" Length="-1" Description="数据。Sql模板或C#模板" />
<Column Name="CreateUserID" DataType="Int32" Description="创建人" Category="扩展" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />

Binary file not shown.

View File

@ -6,7 +6,7 @@
<Description>分布式任务调度系统纯NET打造的重量级大数据实时计算平台万亿级调度经验积累。</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>3.4</VersionPrefix>
<VersionPrefix>4.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
@ -28,7 +28,7 @@
<RepositoryUrl>https://github.com/NewLifeX/AntJob</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
<PackageReleaseNotes>修正RPC粘包处理问题</PackageReleaseNotes>
<PackageReleaseNotes>架构升级</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>

View File

@ -20,6 +20,14 @@
使用教程:[https://newlifex.com/blood/antjob](https://newlifex.com/blood/antjob)
体验地址:[http://ant.newlifex.com](http://ant.newlifex.com/)
# v4架构升级
v4版本是对v3版本的重构主要是为了解决v3版本的一些问题以及提供更多的功能。
v4版本亮点
1. []新增Http接入由AntWeb提供调度服务无需部署AntServer满足轻量级项目需要。进行中等NewLife.Remoting提供WebsocketClient
2. []增强定时调度支持指定Cron表达式逐步替代Start+Step的恒定间隔定时调度
3. []提前生成任务,提前下发给执行器,到时间后马上执行,提高任务执行时间精度
4. []支持任务主动延迟,任务在执行中发现数据条件未满足时,可以向调度中心请求延迟一段时间后再执行,增加执行次数但不增加错误次数
# 功能特点
AntJob的核心是**蚂蚁算法****把任意大数据拆分成为小块,采用蚂蚁搬家策略计算每一块!**
(蚂蚁搬家,一个馒头掉在地上,众多小蚂蚁会把馒头掰成小块小块往家里般!)
@ -28,7 +36,7 @@ AntJob的核心是**蚂蚁算法****把任意大数据拆分成为小块,
2016年在中通快递某产品项目中使用该算法进行大数据实时计算成功挑战每日1200万的订单。并进一步发展衍生成为重量级实时计算平台集分布式计算、集群调度、配置中心、负载均衡、故障转移、跨机房冗余、作业监控告警、百亿级数据清洗、超大Redis缓存>2T于一身于2019年达到每年万亿级计算量2019年双十一日订单量破亿
AntJob是开源简化版仅提供分布式计算和集中调度能力支持百亿级调度(需要改造)
AntJob是开源简化版仅提供分布式计算和集中调度能力支持百亿级调度。
AntJob主要功能点
1. 作业处理器。每一个最小业务模块实现一个处理器类,用于处理这一类作业。例如同步数据表时,每张表写一个处理器类,并在调度中心注册一个作业,调度中心按照作业时间切片得到任务,然后把任务(主要包含时间区间)分派给各个计算节点上的处理器类执行。又如,每天汇总计算是一个作业,而每月汇总计算又是另一个作业;
@ -40,6 +48,7 @@ AntJob主要功能点
1. 作业面板。在Web控制台上可查看每个应用所有作业的运行状态或修改参数
1. 作业重置。调整作业参数,让其再次处理某段时间的任务数据,例如重算过去一个月的数据;
# 定时调度
以下源码位于 [https://github.com/NewLifeX/AntJob/tree/master/Samples/HisAgent](https://github.com/NewLifeX/AntJob/tree/master/Samples/HisAgent)