数据时间使用DataTime,作为作业任务的标杆

This commit is contained in:
智能大石头 2024-05-10 08:08:33 +08:00
parent fc991790de
commit 522df07bed
33 changed files with 276 additions and 212 deletions

View File

@ -68,7 +68,7 @@
<td></td>
<td title="唯一索引">UQ</td>
<td>N</td>
<td></td>
<td>应用英文名</td>
</tr>
<tr>
@ -79,7 +79,7 @@
<td></td>
<td></td>
<td></td>
<td></td>
<td>应用中文名</td>
</tr>
<tr>
@ -90,7 +90,7 @@
<td></td>
<td></td>
<td></td>
<td></td>
<td>一般不设置,应用默认接入</td>
</tr>
<tr>
@ -145,7 +145,7 @@
<td></td>
<td></td>
<td>N</td>
<td></td>
<td>该应用下作业个数</td>
</tr>
<tr>
@ -156,6 +156,28 @@
<td></td>
<td></td>
<td>N</td>
<td>该应用下消息条数</td>
</tr>
<tr>
<td>ManagerId</td>
<td>管理人</td>
<td>Int32</td>
<td></td>
<td></td>
<td></td>
<td>N</td>
<td>负责该应用的管理员</td>
</tr>
<tr>
<td>Manager</td>
<td>管理者</td>
<td>String</td>
<td>50</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
@ -910,14 +932,14 @@
</tr>
<tr>
<td>Start</td>
<td>DataTime</td>
<td>数据时间</td>
<td>DateTime</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>从该时间开始调度作业任务,默认不设置时从当前时间开始</td>
<td>下一次处理数据的时间,默认从当前时间开始</td>
</tr>
<tr>
@ -1301,7 +1323,7 @@
</tr>
<tr>
<td>Start</td>
<td>DataTime</td>
<td>数据时间</td>
<td>DateTime</td>
<td></td>
@ -1615,7 +1637,7 @@
</tr>
<tr>
<td>Start</td>
<td>DataTime</td>
<td>数据时间</td>
<td>DateTime</td>
<td></td>

View File

@ -37,7 +37,7 @@
<None Remove="Build.tt" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.XCode" Version="11.11.2024.417-beta0711" />
<PackageReference Include="NewLife.XCode" Version="11.12.2024.507" />
</ItemGroup>
<ItemGroup>
<None Update="Build.log">

View File

@ -212,7 +212,7 @@ public partial class Job : EntityBase<Job>
{
case JobModes.Data:
case JobModes.Time:
return Time.Year > 2000 && Step > 0;
return DataTime.Year > 2000 && Step > 0;
case JobModes.Message:
return Topic.IsNullOrEmpty();
default:
@ -230,14 +230,14 @@ public partial class Job : EntityBase<Job>
{
if (days < 0)
{
Time = DateTime.MinValue;
DataTime = DateTime.MinValue;
if (stime > DateTime.MinValue)
Time = stime;
DataTime = stime;
End = etime;
}
else
Time = DateTime.Now.Date.AddDays(-days);
DataTime = DateTime.Now.Date.AddDays(-days);
Save();
}
@ -276,7 +276,7 @@ public partial class Job : EntityBase<Job>
{
// 如果禁用,仅返回最简单的字段
// 缺少开始时间赋值会导致客户端启动校验失败Job没有启用的状态下服务器报错无法正常启动
if (!Enable) return new JobModel { Name = Name, Enable = Enable, Time = Time };
if (!Enable) return new JobModel { Name = Name, Enable = Enable, DataTime = DataTime };
return new JobModel
{
@ -284,7 +284,7 @@ public partial class Job : EntityBase<Job>
ClassName = ClassName,
Enable = Enable,
Time = Time,
DataTime = DataTime,
End = End,
Cron = Cron,
Topic = Topic,

View File

@ -13,12 +13,12 @@ using XCode.DataAccessLayer;
namespace AntJob.Data.Entity;
/// <summary>作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑,各个作业之前存在依赖关系</summary>
/// <summary>作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑</summary>
[Serializable]
[DataObject]
[Description("作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑,各个作业之前存在依赖关系")]
[Description("作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑")]
[BindIndex("IU_Job_AppID_Name", true, "AppID,Name")]
[BindTable("Job", Description = "作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑,各个作业之前存在依赖关系", ConnName = "Ant", DbType = DatabaseType.None)]
[BindTable("Job", Description = "作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑", ConnName = "Ant", DbType = DatabaseType.None)]
public partial class Job
{
#region
@ -102,13 +102,13 @@ public partial class Job
[BindColumn("MessageCount", "消息数", "")]
public Int32 MessageCount { get => _MessageCount; set { if (OnPropertyChanging("MessageCount", value)) { _MessageCount = value; OnPropertyChanged("MessageCount"); } } }
private DateTime _Time;
/// <summary>数据时间。从该时间开始调度作业任务,默认不设置时从当前时间开始</summary>
private DateTime _DataTime;
/// <summary>数据时间。下一次处理数据的时间,默认从当前时间开始</summary>
[DisplayName("数据时间")]
[Description("数据时间。从该时间开始调度作业任务,默认不设置时从当前时间开始")]
[Description("数据时间。下一次处理数据的时间,默认从当前时间开始")]
[DataObjectField(false, false, true, 0)]
[BindColumn("Start", "数据时间。从该时间开始调度作业任务,默认不设置时从当前时间开始", "")]
public DateTime Time { get => _Time; set { if (OnPropertyChanging("Time", value)) { _Time = value; OnPropertyChanged("Time"); } } }
[BindColumn("DataTime", "数据时间。下一次处理数据的时间,默认从当前时间开始", "")]
public DateTime DataTime { get => _DataTime; set { if (OnPropertyChanging("DataTime", value)) { _DataTime = value; OnPropertyChanged("DataTime"); } } }
private DateTime _End;
/// <summary>结束。到该时间停止调度作业,默认不设置时永不停止</summary>
@ -385,7 +385,7 @@ public partial class Job
"Cron" => _Cron,
"Topic" => _Topic,
"MessageCount" => _MessageCount,
"Time" => _Time,
"DataTime" => _DataTime,
"End" => _End,
"Step" => _Step,
"BatchSize" => _BatchSize,
@ -431,7 +431,7 @@ public partial class Job
case "Cron": _Cron = Convert.ToString(value); break;
case "Topic": _Topic = Convert.ToString(value); break;
case "MessageCount": _MessageCount = value.ToInt(); break;
case "Time": _Time = value.ToDateTime(); break;
case "DataTime": _DataTime = value.ToDateTime(); break;
case "End": _End = value.ToDateTime(); break;
case "Step": _Step = value.ToInt(); break;
case "BatchSize": _BatchSize = value.ToInt(); break;
@ -512,8 +512,8 @@ public partial class Job
/// <summary>消息数</summary>
public static readonly Field MessageCount = FindByName("MessageCount");
/// <summary>数据时间。从该时间开始调度作业任务,默认不设置时从当前时间开始</summary>
public static readonly Field Time = FindByName("Time");
/// <summary>数据时间。下一次处理数据的时间,默认从当前时间开始</summary>
public static readonly Field DataTime = FindByName("DataTime");
/// <summary>结束。到该时间停止调度作业,默认不设置时永不停止</summary>
public static readonly Field End = FindByName("End");
@ -638,8 +638,8 @@ public partial class Job
/// <summary>消息数</summary>
public const String MessageCount = "MessageCount";
/// <summary>数据时间。从该时间开始调度作业任务,默认不设置时从当前时间开始</summary>
public const String Time = "Time";
/// <summary>数据时间。下一次处理数据的时间,默认从当前时间开始</summary>
public const String DataTime = "DataTime";
/// <summary>结束。到该时间停止调度作业,默认不设置时永不停止</summary>
public const String End = "End";

View File

@ -108,14 +108,14 @@ public partial class JobTask : EntityBase<JobTask>
/// <summary>根据作业、状态、数据时间查找</summary>
/// <param name="jobId">作业</param>
/// <param name="status">状态</param>
/// <param name="time">数据时间</param>
/// <param name="dataTime">数据时间</param>
/// <returns>实体列表</returns>
public static IList<JobTask> FindAllByJobIDAndStatusAndTime(Int32 jobId, JobStatus status, DateTime time)
public static IList<JobTask> FindAllByJobIDAndStatusAndDataTime(Int32 jobId, JobStatus status, DateTime dataTime)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.JobID == jobId && e.Status == status && e.Time == time);
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.JobID == jobId && e.Status == status && e.DataTime == dataTime);
return FindAll(_.JobID == jobId & _.Status == status & _.Time == time);
return FindAll(_.JobID == jobId & _.Status == status & _.DataTime == dataTime);
}
#endregion
@ -141,7 +141,7 @@ public partial class JobTask : EntityBase<JobTask>
if (status >= JobStatus.) exp &= _.Status == status;
if (!client.IsNullOrEmpty()) exp &= _.Client == client;
if (!key.IsNullOrEmpty()) exp &= _.Data.Contains(key) | _.Message.Contains(key) | _.Key == key;
exp &= _.Time.Between(start, end);
exp &= _.DataTime.Between(start, end);
return FindAll(exp, p);
}
@ -199,7 +199,7 @@ public partial class JobTask : EntityBase<JobTask>
{
ID = ID,
Time = Time,
DataTime = DataTime,
End = End,
//Offset = Offset,
//Step = Step,

View File

@ -17,7 +17,7 @@ namespace AntJob.Data.Entity;
[Serializable]
[DataObject]
[Description("作业任务。计算作业在执行过程中生成的任务实例,具有该次执行所需参数")]
[BindIndex("IX_JobTask_JobID_Status_Start", false, "JobID,Status,Start")]
[BindIndex("IX_JobTask_JobID_Status_DataTime", false, "JobID,Status,DataTime")]
[BindIndex("IX_JobTask_AppID_Client_Status", false, "AppID,Client,Status")]
[BindIndex("IX_JobTask_JobID_CreateTime", false, "JobID,CreateTime")]
[BindTable("JobTask", Description = "作业任务。计算作业在执行过程中生成的任务实例,具有该次执行所需参数", ConnName = "Ant", DbType = DatabaseType.None)]
@ -56,13 +56,13 @@ public partial class JobTask
[BindColumn("Client", "客户端。IP加进程", "")]
public String Client { get => _Client; set { if (OnPropertyChanging("Client", value)) { _Client = value; OnPropertyChanged("Client"); } } }
private DateTime _Time;
private DateTime _DataTime;
/// <summary>数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
[DisplayName("数据时间")]
[Description("数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用")]
[DataObjectField(false, false, true, 0)]
[BindColumn("Start", "数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用", "", Master = true)]
public DateTime Time { get => _Time; set { if (OnPropertyChanging("Time", value)) { _Time = value; OnPropertyChanged("Time"); } } }
[BindColumn("DataTime", "数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用", "", Master = true)]
public DateTime DataTime { get => _DataTime; set { if (OnPropertyChanging("DataTime", value)) { _DataTime = value; OnPropertyChanged("DataTime"); } } }
private DateTime _End;
/// <summary>结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
@ -250,7 +250,7 @@ public partial class JobTask
"AppID" => _AppID,
"JobID" => _JobID,
"Client" => _Client,
"Time" => _Time,
"DataTime" => _DataTime,
"End" => _End,
"BatchSize" => _BatchSize,
"Total" => _Total,
@ -282,7 +282,7 @@ public partial class JobTask
case "AppID": _AppID = value.ToInt(); break;
case "JobID": _JobID = value.ToInt(); break;
case "Client": _Client = Convert.ToString(value); break;
case "Time": _Time = value.ToDateTime(); break;
case "DataTime": _DataTime = value.ToDateTime(); break;
case "End": _End = value.ToDateTime(); break;
case "BatchSize": _BatchSize = value.ToInt(); break;
case "Total": _Total = value.ToInt(); break;
@ -346,7 +346,7 @@ public partial class JobTask
public static readonly Field Client = FindByName("Client");
/// <summary>数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
public static readonly Field Time = FindByName("Time");
public static readonly Field DataTime = FindByName("DataTime");
/// <summary>结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
public static readonly Field End = FindByName("End");
@ -430,7 +430,7 @@ public partial class JobTask
public const String Client = "Client";
/// <summary>数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
public const String Time = "Time";
public const String DataTime = "DataTime";
/// <summary>结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),消息调度不适用</summary>
public const String End = "End";

View File

@ -116,7 +116,7 @@ public partial class JobError : EntityBase<JobError>
if (jobid > 0) exp &= _.JobID == jobid;
if (!client.IsNullOrEmpty()) exp &= _.Client == client;
if (!key.IsNullOrEmpty()) exp &= _.Message.Contains(key);
exp &= _.Time.Between(start, end);
exp &= _.DataTime.Between(start, end);
return FindAll(exp, p);
}

View File

@ -63,13 +63,13 @@ public partial class JobError
[BindColumn("Client", "客户端。IP加进程", "")]
public String Client { get => _Client; set { if (OnPropertyChanging("Client", value)) { _Client = value; OnPropertyChanged("Client"); } } }
private DateTime _Time;
private DateTime _DataTime;
/// <summary>数据时间。大于等于</summary>
[DisplayName("数据时间")]
[Description("数据时间。大于等于")]
[DataObjectField(false, false, true, 0)]
[BindColumn("Start", "数据时间。大于等于", "")]
public DateTime Time { get => _Time; set { if (OnPropertyChanging("Time", value)) { _Time = value; OnPropertyChanged("Time"); } } }
[BindColumn("DataTime", "数据时间。大于等于", "")]
public DateTime DataTime { get => _DataTime; set { if (OnPropertyChanging("DataTime", value)) { _DataTime = value; OnPropertyChanged("DataTime"); } } }
private DateTime _End;
/// <summary>结束。小于,不等于</summary>
@ -170,7 +170,7 @@ public partial class JobError
"JobID" => _JobID,
"TaskID" => _TaskID,
"Client" => _Client,
"Time" => _Time,
"DataTime" => _DataTime,
"End" => _End,
"Data" => _Data,
"Server" => _Server,
@ -192,7 +192,7 @@ public partial class JobError
case "JobID": _JobID = value.ToInt(); break;
case "TaskID": _TaskID = value.ToInt(); break;
case "Client": _Client = Convert.ToString(value); break;
case "Time": _Time = value.ToDateTime(); break;
case "DataTime": _DataTime = value.ToDateTime(); break;
case "End": _End = value.ToDateTime(); break;
case "Data": _Data = Convert.ToString(value); break;
case "Server": _Server = Convert.ToString(value); break;
@ -232,7 +232,7 @@ public partial class JobError
/// <summary>作业项</summary>
[Map(nameof(TaskID), typeof(JobTask), "ID")]
public String TaskTime => Task?.ToString();
public String TaskDataTime => Task?.ToString();
#endregion
@ -256,7 +256,7 @@ public partial class JobError
public static readonly Field Client = FindByName("Client");
/// <summary>数据时间。大于等于</summary>
public static readonly Field Time = FindByName("Time");
public static readonly Field DataTime = FindByName("DataTime");
/// <summary>结束。小于,不等于</summary>
public static readonly Field End = FindByName("End");
@ -310,7 +310,7 @@ public partial class JobError
public const String Client = "Client";
/// <summary>数据时间。大于等于</summary>
public const String Time = "Time";
public const String DataTime = "DataTime";
/// <summary>结束。小于,不等于</summary>
public const String End = "End";

View File

@ -31,27 +31,27 @@ public partial class App
public Int32 ID { get => _ID; set { if (OnPropertyChanging("ID", value)) { _ID = value; OnPropertyChanged("ID"); } } }
private String _Name;
/// <summary>名称</summary>
/// <summary>名称。应用英文名</summary>
[DisplayName("名称")]
[Description("名称")]
[Description("名称。应用英文名")]
[DataObjectField(false, false, false, 50)]
[BindColumn("Name", "名称", "", Master = true)]
[BindColumn("Name", "名称。应用英文名", "", Master = true)]
public String Name { get => _Name; set { if (OnPropertyChanging("Name", value)) { _Name = value; OnPropertyChanged("Name"); } } }
private String _DisplayName;
/// <summary>显示名</summary>
/// <summary>显示名。应用中文名</summary>
[DisplayName("显示名")]
[Description("显示名")]
[Description("显示名。应用中文名")]
[DataObjectField(false, false, true, 50)]
[BindColumn("DisplayName", "显示名", "")]
[BindColumn("DisplayName", "显示名。应用中文名", "")]
public String DisplayName { get => _DisplayName; set { if (OnPropertyChanging("DisplayName", value)) { _DisplayName = value; OnPropertyChanged("DisplayName"); } } }
private String _Secret;
/// <summary>密钥</summary>
/// <summary>密钥。一般不设置,应用默认接入</summary>
[DisplayName("密钥")]
[Description("密钥")]
[Description("密钥。一般不设置,应用默认接入")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Secret", "密钥", "")]
[BindColumn("Secret", "密钥。一般不设置,应用默认接入", "")]
public String Secret { get => _Secret; set { if (OnPropertyChanging("Secret", value)) { _Secret = value; OnPropertyChanged("Secret"); } } }
private String _Category;
@ -87,21 +87,37 @@ public partial class App
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private Int32 _JobCount;
/// <summary>作业数</summary>
/// <summary>作业数。该应用下作业个数</summary>
[DisplayName("作业数")]
[Description("作业数")]
[Description("作业数。该应用下作业个数")]
[DataObjectField(false, false, false, 0)]
[BindColumn("JobCount", "作业数", "")]
[BindColumn("JobCount", "作业数。该应用下作业个数", "")]
public Int32 JobCount { get => _JobCount; set { if (OnPropertyChanging("JobCount", value)) { _JobCount = value; OnPropertyChanged("JobCount"); } } }
private Int32 _MessageCount;
/// <summary>消息数</summary>
/// <summary>消息数。该应用下消息条数</summary>
[DisplayName("消息数")]
[Description("消息数")]
[Description("消息数。该应用下消息条数")]
[DataObjectField(false, false, false, 0)]
[BindColumn("MessageCount", "消息数", "")]
[BindColumn("MessageCount", "消息数。该应用下消息条数", "")]
public Int32 MessageCount { get => _MessageCount; set { if (OnPropertyChanging("MessageCount", value)) { _MessageCount = value; OnPropertyChanged("MessageCount"); } } }
private Int32 _ManagerId;
/// <summary>管理人。负责该应用的管理员</summary>
[DisplayName("管理人")]
[Description("管理人。负责该应用的管理员")]
[DataObjectField(false, false, false, 0)]
[BindColumn("ManagerId", "管理人。负责该应用的管理员", "")]
public Int32 ManagerId { get => _ManagerId; set { if (OnPropertyChanging("ManagerId", value)) { _ManagerId = value; OnPropertyChanged("ManagerId"); } } }
private String _Manager;
/// <summary>管理者</summary>
[DisplayName("管理者")]
[Description("管理者")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Manager", "管理者", "")]
public String Manager { get => _Manager; set { if (OnPropertyChanging("Manager", value)) { _Manager = value; OnPropertyChanged("Manager"); } } }
private Int32 _CreateUserID;
/// <summary>创建人</summary>
[Category("扩展")]
@ -202,6 +218,8 @@ public partial class App
"Enable" => _Enable,
"JobCount" => _JobCount,
"MessageCount" => _MessageCount,
"ManagerId" => _ManagerId,
"Manager" => _Manager,
"CreateUserID" => _CreateUserID,
"CreateUser" => _CreateUser,
"CreateTime" => _CreateTime,
@ -227,6 +245,8 @@ public partial class App
case "Enable": _Enable = value.ToBoolean(); break;
case "JobCount": _JobCount = value.ToInt(); break;
case "MessageCount": _MessageCount = value.ToInt(); break;
case "ManagerId": _ManagerId = value.ToInt(); break;
case "Manager": _Manager = Convert.ToString(value); break;
case "CreateUserID": _CreateUserID = value.ToInt(); break;
case "CreateUser": _CreateUser = Convert.ToString(value); break;
case "CreateTime": _CreateTime = value.ToDateTime(); break;
@ -243,6 +263,14 @@ public partial class App
#endregion
#region
/// <summary>管理人</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public XCode.Membership.User MyManager => Extends.Get(nameof(MyManager), k => XCode.Membership.User.FindByID(ManagerId));
/// <summary>管理人</summary>
[Map(nameof(ManagerId), typeof(XCode.Membership.User), "ID")]
public String ManagerName => MyManager?.Name;
#endregion
#region
@ -252,13 +280,13 @@ public partial class App
/// <summary>编号</summary>
public static readonly Field ID = FindByName("ID");
/// <summary>名称</summary>
/// <summary>名称。应用英文名</summary>
public static readonly Field Name = FindByName("Name");
/// <summary>显示名</summary>
/// <summary>显示名。应用中文名</summary>
public static readonly Field DisplayName = FindByName("DisplayName");
/// <summary>密钥</summary>
/// <summary>密钥。一般不设置,应用默认接入</summary>
public static readonly Field Secret = FindByName("Secret");
/// <summary>类别</summary>
@ -273,12 +301,18 @@ public partial class App
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>作业数</summary>
/// <summary>作业数。该应用下作业个数</summary>
public static readonly Field JobCount = FindByName("JobCount");
/// <summary>消息数</summary>
/// <summary>消息数。该应用下消息条数</summary>
public static readonly Field MessageCount = FindByName("MessageCount");
/// <summary>管理人。负责该应用的管理员</summary>
public static readonly Field ManagerId = FindByName("ManagerId");
/// <summary>管理者</summary>
public static readonly Field Manager = FindByName("Manager");
/// <summary>创建人</summary>
public static readonly Field CreateUserID = FindByName("CreateUserID");
@ -315,13 +349,13 @@ public partial class App
/// <summary>编号</summary>
public const String ID = "ID";
/// <summary>名称</summary>
/// <summary>名称。应用英文名</summary>
public const String Name = "Name";
/// <summary>显示名</summary>
/// <summary>显示名。应用中文名</summary>
public const String DisplayName = "DisplayName";
/// <summary>密钥</summary>
/// <summary>密钥。一般不设置,应用默认接入</summary>
public const String Secret = "Secret";
/// <summary>类别</summary>
@ -336,12 +370,18 @@ public partial class App
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>作业数</summary>
/// <summary>作业数。该应用下作业个数</summary>
public const String JobCount = "JobCount";
/// <summary>消息数</summary>
/// <summary>消息数。该应用下消息条数</summary>
public const String MessageCount = "MessageCount";
/// <summary>管理人。负责该应用的管理员</summary>
public const String ManagerId = "ManagerId";
/// <summary>管理者</summary>
public const String Manager = "Manager";
/// <summary>创建人</summary>
public const String CreateUserID = "CreateUserID";

View File

@ -42,15 +42,17 @@
<Table Name="App" Description="应用系统。管理数据计算作业的应用模块,计算作业隶属于某个应用">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Secret" DataType="String" Description="密钥" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称。应用英文名" />
<Column Name="DisplayName" DataType="String" Description="显示名。应用中文名" />
<Column Name="Secret" DataType="String" Description="密钥。一般不设置,应用默认接入" />
<Column Name="Category" DataType="String" Description="类别" />
<Column Name="Version" DataType="String" Description="版本" />
<Column Name="CompileTime" DataType="DateTime" Description="编译时间" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="JobCount" DataType="Int32" Description="作业数" />
<Column Name="MessageCount" DataType="Int32" Description="消息数" />
<Column Name="JobCount" DataType="Int32" Description="作业数。该应用下作业个数" />
<Column Name="MessageCount" DataType="Int32" Description="消息数。该应用下消息条数" />
<Column Name="ManagerId" DataType="Int32" Map="XCode.Membership.User@ID@Name" Description="管理人。负责该应用的管理员" />
<Column Name="Manager" DataType="String" Description="管理者" />
<Column Name="CreateUserID" DataType="Int32" Description="创建人" Category="扩展" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
@ -132,7 +134,7 @@
<Index Columns="UpdateTime" />
</Indexes>
</Table>
<Table Name="Job" Description="作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑,各个作业之前存在依赖关系">
<Table Name="Job" Description="作业。数据计算逻辑的主要单元,每个作业即是一个业务逻辑">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="AppID" DataType="Int32" Map="App@ID@$" Description="应用" />
@ -144,7 +146,7 @@
<Column Name="Cron" DataType="String" Description="执行频次。定时调度的Cron表达式" />
<Column Name="Topic" DataType="String" Description="主题。消息调度时消费的主题" />
<Column Name="MessageCount" DataType="Int32" Description="消息数" />
<Column Name="Time" ColumnName="Start" DataType="DateTime" Description="数据时间。从该时间开始调度作业任务,默认不设置时从当前时间开始" />
<Column Name="DataTime" DataType="DateTime" Description="数据时间。下一次处理数据的时间,默认从当前时间开始" />
<Column Name="End" DataType="DateTime" Description="结束。到该时间停止调度作业,默认不设置时永不停止" />
<Column Name="Step" DataType="Int32" Description="步进。切分任务的时间区间,秒" />
<Column Name="BatchSize" DataType="Int32" Description="批大小。数据调度每次抽取数据的分页大小,或消息调度每次处理的消息数,定时调度不适用" />
@ -185,7 +187,7 @@
<Column Name="AppID" DataType="Int32" Map="App@ID@$" Description="应用" />
<Column Name="JobID" DataType="Int32" Map="Job@ID@$" Description="作业" />
<Column Name="Client" DataType="String" Description="客户端。IP加进程" />
<Column Name="Time" ColumnName="Start" DataType="DateTime" Master="True" Description="数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用" />
<Column Name="DataTime" DataType="DateTime" Master="True" Description="数据时间。大于等于,定时调度到达该时间点后触发(可能有偏移量),消息调度不适用" />
<Column Name="End" DataType="DateTime" Description="结束。小于不等于,数据调度到达该时间点后触发(可能有偏移量),消息调度不适用" />
<Column Name="BatchSize" DataType="Int32" Description="批大小。数据调度每次抽取数据的分页大小,或消息调度每次处理的消息数,定时调度不适用" />
<Column Name="Total" DataType="Int32" Description="总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1" />
@ -209,7 +211,7 @@
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="JobID,Status,Start" />
<Index Columns="JobID,Status,DataTime" />
<Index Columns="AppID,Client,Status" />
<Index Columns="JobID,CreateTime" />
</Indexes>
@ -221,7 +223,7 @@
<Column Name="JobID" DataType="Int32" Map="Job@ID@$" Description="作业" />
<Column Name="TaskID" DataType="Int32" Map="JobTask@ID@$" Description="作业项" />
<Column Name="Client" DataType="String" Description="客户端。IP加进程" />
<Column Name="Time" ColumnName="Start" DataType="DateTime" Description="数据时间。大于等于" />
<Column Name="DataTime" DataType="DateTime" Description="数据时间。大于等于" />
<Column Name="End" DataType="DateTime" Description="结束。小于,不等于" />
<Column Name="Data" DataType="String" Length="2000" Description="数据" />
<Column Name="Server" DataType="String" Description="服务器" />

View File

@ -43,7 +43,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.XCode" Version="11.11.2024.417-beta0711" />
<PackageReference Include="NewLife.XCode" Version="11.12.2024.507" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AntJob\AntJob.csproj" />

View File

@ -89,7 +89,7 @@ public abstract class DataHandler : Handler
if (job.Step == 0) job.Step = 30;
// 获取最小时间
if (job.Time.Year < 2000) throw new InvalidOperationException("数据任务必须设置开始时间");
if (job.DataTime.Year < 2000) throw new InvalidOperationException("数据任务必须设置开始时间");
return base.Start();
}
@ -147,7 +147,7 @@ public abstract class DataHandler : Handler
if (task == null) throw new ArgumentNullException(nameof(task), "没有设置数据抽取配置");
// 验证时间段
var start = task.Time;
var start = task.DataTime;
var end = task.End;
// 区间无效

View File

@ -28,7 +28,7 @@ public class SqlHandler : Handler
{
//var sqls = ctx.Task.Data as String;
var sqls = Job.Data;
sqls = TemplateHelper.Build(sqls, ctx.Task.Time, ctx.Task.End);
sqls = TemplateHelper.Build(sqls, ctx.Task.DataTime, ctx.Task.End);
// 向调度中心返回解析后的Sql语句
ctx.Remark = sqls;

View File

@ -45,7 +45,7 @@ public class SqlMessage : MessageHandler
{
if (dt == null || dt.Columns == null || dt.Columns.Length == 0 || dt.Rows == null || dt.Rows.Count == 0) return;
// select id as topic_roleId, id as topic_myId from role where updatetime>='{Start}' and updatetime<'{End}'
// select id as topic_roleId, id as topic_myId from role where updatetime>='{dt}' and updatetime<'{End}'
for (var i = 0; i < dt.Columns.Length; i++)
{

View File

@ -29,7 +29,7 @@
<Content Include="favicon.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Redis" Version="5.6.2024.420-beta0005" />
<PackageReference Include="NewLife.Redis" Version="5.6.2024.508" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AntJob.Data\AntJob.Data.csproj" />

View File

@ -50,7 +50,7 @@ public class JobService
AppID = app.ID,
Name = item.Name,
Enable = item.Enable,
Time = item.Time,
DataTime = item.DataTime,
End = item.End,
Offset = item.Offset,
Step = item.Step,
@ -74,8 +74,8 @@ public class JobService
// 计算下一次执行时间
var cron = new Cron(job.Cron);
var time = item.Time.Year > 2000 ? item.Time : DateTime.Now;
item.Time = cron.GetNext(time);
var time = item.DataTime.Year > 2000 ? item.DataTime : DateTime.Now;
item.DataTime = cron.GetNext(time);
if (job.Step <= 0) job.Step = 30;
}
@ -118,7 +118,7 @@ public class JobService
job = Job.FindByAppIDAndName(app.ID, jobName);
if (job == null) throw new XException($"应用[{app.ID}/{app.Name}]下未找到作业[{jobName}]");
if (job.Step == 0 || job.Time.Year <= 2000) throw new XException("作业[{0}/{1}]未设置开始时间或步进", job.ID, job.Name);
if (job.Step == 0 || job.DataTime.Year <= 2000) throw new XException("作业[{0}/{1}]未设置开始时间或步进", job.ID, job.Name);
var online = _appService.GetOnline(app, ip);
@ -157,7 +157,7 @@ public class JobService
default:
{
// 如果能够切片,则查询数据库后进入,避免缓存导致重复
if (TrySplit(job, job.Time, job.Step, out var end))
if (TrySplit(job, job.DataTime, job.Step, out var end))
{
// 申请任务前,不能再查数据库,那样子会导致多线程脏读,从而出现多客户端分到相同任务的情况
//jb = Job.FindByKey(jb.ID);
@ -390,7 +390,7 @@ public class JobService
AppID = job.AppID,
JobID = job.ID,
TaskID = task.ID,
Time = task.Time,
DataTime = task.DataTime,
End = task.End,
Data = task.Data,
@ -450,7 +450,7 @@ public class JobService
//using var ck = cache.AcquireLock($"Job:{ID}", 5_000);
using var ts = Job.Meta.CreateTrans();
var start = job.Time;
var start = job.DataTime;
for (var i = 0; i < count; i++)
{
var end = DateTime.MinValue;
@ -463,7 +463,7 @@ public class JobService
{
AppID = job.AppID,
JobID = job.ID,
Time = start,
DataTime = start,
End = end,
BatchSize = job.BatchSize,
@ -476,7 +476,7 @@ public class JobService
};
//// 如果有模板,则进行计算替换
//if (!Data.IsNullOrEmpty()) ti.Data = TemplateHelper.Build(Data, ti.Start, ti.End);
//if (!Data.IsNullOrEmpty()) ti.Data = TemplateHelper.Build(Data, ti.DataTime, ti.End);
// 重复切片判断
var key = $"job:task:{job.ID}:{start:yyyyMMddHHmmss}";
@ -494,7 +494,7 @@ public class JobService
}
// 更新任务
job.Time = end;
job.DataTime = end;
start = end;
}
@ -520,7 +520,7 @@ public class JobService
/// <returns></returns>
public Boolean TrySplitTime(Job job, Boolean modify, out DateTime end)
{
var start = job.Time;
var start = job.DataTime;
// 当前时间减去偏移量,作为当前时间。数据抽取不许超过该时间。去掉毫秒
var now = DateTime.Now.AddSeconds(-job.Offset).Trim("s");
@ -542,14 +542,14 @@ public class JobService
if (!job.Cron.IsNullOrEmpty())
{
var cron = new Cron(job.Cron);
var time = job.Time.Year > 2000 ? job.Time : DateTime.Now;
job.Time = cron.GetNext(time);
var time = job.DataTime.Year > 2000 ? job.DataTime : DateTime.Now;
job.DataTime = cron.GetNext(time);
}
else
{
var step = job.Step;
if (step <= 0) step = 30;
job.Time = job.Time.AddSeconds(step);
job.DataTime = job.DataTime.AddSeconds(step);
}
}

View File

@ -115,7 +115,7 @@ public class AppController : AntEntityController<App>
var jobs = Job.FindAllByAppID2(appid);
foreach (var job in jobs)
{
job.Time = new DateTime(now.Year, now.Month, 1);
job.DataTime = new DateTime(now.Year, now.Month, 1);
job.ResetOther();
}

View File

@ -47,12 +47,12 @@ public class JobController : AntEntityController<Job>
var job = data as Job;
return job.Mode switch
{
JobModes.Data => job.Time.ToFullString(""),
JobModes.Data => job.DataTime.ToFullString(""),
JobModes.Time => job.Cron,
JobModes.Message => job.Topic,
//JobModes.CSharp => "[C#]" + job.Time.ToFullString(""),
//JobModes.Sql => "[Sql]" + job.Time.ToFullString(""),
_ => job.Time.ToFullString(""),
_ => job.DataTime.ToFullString(""),
};
}
}

View File

@ -28,7 +28,7 @@
{
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("AppName"))">应用</a></th>
}
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("Start"))" title="@Job._.Time.Description">开始时间</a></th>
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("DataTime"))" title="@Job._.DataTime.Description">数据时间</a></th>
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("End"))" title="@Job._.End.Description">结束</a></th>
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("Step"))" title="@Job._.Step.Description">步进</a></th>
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("BatchSize"))" title="@Job._.BatchSize.Description">批大小</a></th>
@ -54,8 +54,8 @@
<tbody>
@foreach (var entity in Model)
{
var st = entity.Time.ToFullString("");
if (entity.Time.Date == DateTime.Now.Date) { st = entity.Time.ToString("HH:mm:ss"); }
var st = entity.DataTime.ToFullString("");
if (entity.DataTime.Date == DateTime.Now.Date) { st = entity.DataTime.ToString("HH:mm:ss"); }
if (entity.Mode == JobModes.Message) { st = $"{entity.Topic}/{entity.MessageCount}"; }
var ut = entity.UpdateTime.ToFullString("");

View File

@ -45,7 +45,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="10.10.2024.422-beta0647" />
<PackageReference Include="NewLife.Core" Version="10.10.2024.507" />
<PackageReference Include="NewLife.Remoting" Version="2.8.2024.419-beta0703" />
<PackageReference Include="NewLife.Stardust" Version="2.9.2024.422-beta0942" />
</ItemGroup>

View File

@ -15,7 +15,7 @@ public interface IJob
Boolean Enable { get; set; }
/// <summary>数据时间。定时调度的执行时间点,或者数据调度的开始时间</summary>
DateTime Time { get; set; }
DateTime DataTime { get; set; }
/// <summary>结束。小于该时间,数据作业使用</summary>
DateTime End { get; set; }

View File

@ -7,7 +7,7 @@ public interface ITask
Int32 ID { get; set; }
/// <summary>数据时间。定时调度的执行时间点,或者数据调度的开始时间</summary>
DateTime Time { get; set; }
DateTime DataTime { get; set; }
/// <summary>结束。小于</summary>
DateTime End { get; set; }

View File

@ -21,7 +21,7 @@ public partial class JobModel
/// <summary>数据时间。定时调度的执行时间点,或者数据调度的开始时间</summary>
[XmlAttribute]
public DateTime Time { get; set; }
public DateTime DataTime { get; set; }
/// <summary>结束。小于</summary>
[XmlAttribute]

View File

@ -8,7 +8,7 @@ public partial class TaskModel : ITask
public Int32 ID { get; set; }
/// <summary>数据时间。定时调度的执行时间点,或者数据调度的开始时间</summary>
public DateTime Time { get; set; }
public DateTime DataTime { get; set; }
/// <summary>结束。小于,不等于</summary>
public DateTime End { get; set; }

View File

@ -20,7 +20,8 @@ public static class TemplateHelper
var p = 0;
while (true)
{
var ti = Find(str, "Start", p);
var ti = Find(str, "DataTime", p);
ti ??= Find(str, "dt", p);
if (ti == null)
{
sb.Append(str.Substring(p));

View File

@ -61,7 +61,7 @@ public abstract class Handler : IExtend, ITracerFeature, ILogFeature
var now = DateTime.Now;
var job = new JobModel
{
Time = new DateTime(now.Year, now.Month, 1),
DataTime = new DateTime(now.Year, now.Month, 1),
Step = 30,
Offset = 15,
Mode = JobModes.Time,
@ -84,7 +84,7 @@ public abstract class Handler : IExtend, ITracerFeature, ILogFeature
var msg = "开始工作";
var job = Job;
if (job != null) msg += $" {job.Enable} 区间({job.Time.ToFullString("")}, {job.End.ToFullString("")} Offset={job.Offset} Step={job.Step} MaxTask={job.MaxTask}";
if (job != null) msg += $" {job.Enable} 区间({job.DataTime.ToFullString("")}, {job.End.ToFullString("")} Offset={job.Offset} Step={job.Step} MaxTask={job.MaxTask}";
using var span = Tracer?.NewSpan($"job:{Name}:Start", msg);
WriteLog(msg);
@ -145,7 +145,7 @@ public abstract class Handler : IExtend, ITracerFeature, ILogFeature
};
// APM埋点
var span = Schedule.Tracer?.NewSpan($"job:{Name}", task.Data ?? $"({task.Time.ToFullString()}, {task.End.ToFullString()})");
var span = Schedule.Tracer?.NewSpan($"job:{Name}", task.Data ?? $"({task.DataTime.ToFullString()}, {task.End.ToFullString()})");
result.TraceId = span?.ToString();
var sw = Stopwatch.StartNew();

View File

@ -43,7 +43,7 @@ public class FileJobProvider : JobProvider
var df = job?.Job;
if (df != null) model.Copy(df);
if (model.Time.Year <= 2000) model.Time = DateTime.Now.Date;
if (model.DataTime.Year <= 2000) model.DataTime = DateTime.Now.Date;
if (model.Step <= 0) model.Step = 30;
if (model.BatchSize <= 0) model.BatchSize = 10000;
if (model.MaxTask <= 0) model.MaxTask = Environment.ProcessorCount;
@ -108,7 +108,7 @@ public class FileJobProvider : JobProvider
var step = job.Step;
if (step <= 0) step = 30;
var start = job.Time;
var start = job.DataTime;
for (var i = 0; i < count; i++)
{
// 开始时间和结束时间是否越界
@ -130,7 +130,7 @@ public class FileJobProvider : JobProvider
// 切分新任务
var task = new TaskModel
{
Time = start,
DataTime = start,
End = end,
//Step = job.Step,
//Offset = job.Offset,
@ -138,7 +138,7 @@ public class FileJobProvider : JobProvider
};
// 更新任务
job.Time = end;
job.DataTime = end;
start = end;
list.Add(task);
@ -163,7 +163,7 @@ public class FileJobProvider : JobProvider
if (ctx.Total > 0)
{
var set = ctx.Task;
var time = set.Time;
var time = set.DataTime;
var end = set.End;
var n = 0;
if (end > time) n = (Int32)(end - time).TotalSeconds;

View File

@ -11,8 +11,8 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NewLife.UnitTest" Version="1.0.2024.102-beta0146" />
<PackageReference Include="xunit" Version="2.7.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.8">
<PackageReference Include="xunit" Version="2.8.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@ -9,7 +9,7 @@ namespace AntTest
public void ParseQuery()
{
var tt = @"/*use his*/
select * from t1 where time between '{Start}' and '{End}'
select * from t1 where time between '{dt}' and '{End}'
";
var section = new SqlSection();
@ -17,7 +17,7 @@ select * from t1 where time between '{Start}' and '{End}'
Assert.Equal("his", section.ConnName);
Assert.Equal(SqlActions.Query, section.Action);
Assert.Equal("select * from t1 where time between '{Start}' and '{End}'", section.Sql);
Assert.Equal("select * from t1 where time between '{dt}' and '{End}'", section.Sql);
}
[Fact]
@ -39,7 +39,7 @@ insert into t1 (c1, c2) values(v1, v2);
public void ParseDelete()
{
var tt = @"/*use his*/
delete from t2 where time between '{Start}' and '{End}';
delete from t2 where time between '{dt}' and '{End}';
";
var section = new SqlSection();
@ -47,7 +47,7 @@ delete from t2 where time between '{Start}' and '{End}';
Assert.Equal("his", section.ConnName);
Assert.Equal(SqlActions.Execute, section.Action);
Assert.Equal("delete from t2 where time between '{Start}' and '{End}'", section.Sql);
Assert.Equal("delete from t2 where time between '{dt}' and '{End}'", section.Sql);
}
[Fact]
@ -85,10 +85,10 @@ insert t2;
public void ParseAllSqls()
{
var tt = @"/*use his*/
select * from t1 where time between '{Start}' and '{End}'
select * from t1 where time between '{dt}' and '{End}'
/*use his_bak*/
delete from t2 where time between '{Start}' and '{End}';
delete from t2 where time between '{dt}' and '{End}';
/*use his_bak*/
insert t2;
@ -100,11 +100,11 @@ insert t2;
Assert.Equal("his", cs[0].ConnName);
Assert.Equal(SqlActions.Query, cs[0].Action);
Assert.Equal("select * from t1 where time between '{Start}' and '{End}'", cs[0].Sql);
Assert.Equal("select * from t1 where time between '{dt}' and '{End}'", cs[0].Sql);
Assert.Equal("his_bak", cs[1].ConnName);
Assert.Equal(SqlActions.Execute, cs[1].Action);
Assert.Equal("delete from t2 where time between '{Start}' and '{End}'", cs[1].Sql);
Assert.Equal("delete from t2 where time between '{dt}' and '{End}'", cs[1].Sql);
Assert.Equal("his_bak", cs[2].ConnName);
Assert.Equal(SqlActions.Insert, cs[2].Action);

View File

@ -2,95 +2,94 @@
using AntJob.Data;
using Xunit;
namespace AntTest
namespace AntTest;
public class TemplateHelperTests
{
public class TemplateHelperTests
[Fact]
public void BuildTest()
{
[Fact]
public void BuildTest()
{
var tt = @"/*use His*/
insert into t1(xxx) select * from t2 where time between {Start} and {End}";
var start = DateTime.Now;
var end = start.AddSeconds(30);
var tt = @"/*use His*/
insert into t1(xxx) select * from t2 where time between {dt} and {End}";
var start = DateTime.Now;
var end = start.AddSeconds(30);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{Start}", str);
Assert.DoesNotContain("{End}", str);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{dt}", str);
Assert.DoesNotContain("{End}", str);
var rs = tt.Replace("{Start}", start.ToFullString()).Replace("{End}", end.ToFullString());
Assert.Equal(rs, str);
}
var rs = tt.Replace("{dt}", start.ToFullString()).Replace("{End}", end.ToFullString());
Assert.Equal(rs, str);
}
[Fact]
public void BuildTest2()
{
var tt = @"/*use His*/
insert into t1(xxx) select * from t2 where time between {Start:yyMMdd} and {End:HH:mm:ss}";
var start = DateTime.Now;
var end = start.AddSeconds(30);
[Fact]
public void BuildTest2()
{
var tt = @"/*use His*/
insert into t1(xxx) select * from t2 where time between {dt:yyMMdd} and {End:HH:mm:ss}";
var start = DateTime.Now;
var end = start.AddSeconds(30);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{Start:yyMMdd}", str);
Assert.DoesNotContain("{End:HH:mm:ss}", str);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{dt:yyMMdd}", str);
Assert.DoesNotContain("{End:HH:mm:ss}", str);
var rs = tt.Replace("{Start:yyMMdd}", start.ToString("yyMMdd")).Replace("{End:HH:mm:ss}", end.ToString("HH:mm:ss"));
Assert.Equal(rs, str);
}
var rs = tt.Replace("{dt:yyMMdd}", start.ToString("yyMMdd")).Replace("{End:HH:mm:ss}", end.ToString("HH:mm:ss"));
Assert.Equal(rs, str);
}
[Fact]
public void BuildTest3()
{
var tt = @"/*use His*/
insert into t1(xxx) select * from t2 where time between {Start:yyMMdd} and {End:HH:mm:ss} time2 between {Start:yyMMdd} and {End:yyMMdd}";
var start = DateTime.Now;
var end = start.AddSeconds(30);
[Fact]
public void BuildTest3()
{
var tt = @"/*use His*/
insert into t1(xxx) select * from t2 where time between {dt:yyMMdd} and {End:HH:mm:ss} time2 between {dt:yyMMdd} and {End:yyMMdd}";
var start = DateTime.Now;
var end = start.AddSeconds(30);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{Start:yyMMdd}", str);
Assert.DoesNotContain("{End:HH:mm:ss}", str);
Assert.DoesNotContain("{End:yyMMdd}", str);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{dt:yyMMdd}", str);
Assert.DoesNotContain("{End:HH:mm:ss}", str);
Assert.DoesNotContain("{End:yyMMdd}", str);
var rs = tt
.Replace("{Start:yyMMdd}", start.ToString("yyMMdd"))
.Replace("{End:HH:mm:ss}", end.ToString("HH:mm:ss"))
.Replace("{End:yyMMdd}", end.ToString("yyMMdd"))
;
Assert.Equal(rs, str);
}
var rs = tt
.Replace("{dt:yyMMdd}", start.ToString("yyMMdd"))
.Replace("{End:HH:mm:ss}", end.ToString("HH:mm:ss"))
.Replace("{End:yyMMdd}", end.ToString("yyMMdd"))
;
Assert.Equal(rs, str);
}
[Fact]
public void BuildTest4()
{
var tt = @"/*use his*/
select * from t1 where time between '{Start}' and '{End}'
[Fact]
public void BuildTest4()
{
var tt = @"/*use his*/
select * from t1 where time between '{dt}' and '{End}'
/*use hist_bak*/
delete from t2 where time between '{Start}' and '{End}';
delete from t2 where time between '{dt}' and '{End}';
/*use hist_bak*/
/*batchinsert t2*/
";
var start = DateTime.Now;
var end = start.AddSeconds(30);
var start = DateTime.Now;
var end = start.AddSeconds(30);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{Start}", str);
Assert.DoesNotContain("{End}", str);
var str = TemplateHelper.Build(tt, start, end);
Assert.NotNull(str);
Assert.NotEmpty(str);
Assert.DoesNotContain("{dt}", str);
Assert.DoesNotContain("{End}", str);
var rs = tt
.Replace("{Start}", start.ToFullString())
.Replace("{End}", end.ToFullString())
;
Assert.Equal(rs, str);
}
var rs = tt
.Replace("{dt}", start.ToFullString())
.Replace("{End}", end.ToFullString())
;
Assert.Equal(rs, str);
}
}

View File

@ -15,7 +15,7 @@ class BuildWill : DataHandler
public BuildWill()
{
var job = Job;
job.Time = DateTime.Today;
job.DataTime = DateTime.Today;
job.Step = 30;
job.BatchSize = 1000;
}

View File

@ -15,10 +15,10 @@ internal class HelloJob : Handler
protected override Int32 Execute(JobContext ctx)
{
using var span = Tracer?.NewSpan("HelloJob", ctx.Task.Time);
using var span = Tracer?.NewSpan("HelloJob", ctx.Task.DataTime);
// 当前任务时间
var time = ctx.Task.Time;
var time = ctx.Task.DataTime;
WriteLog("新生命蚂蚁调度系统!当前任务时间:{0}", time);
// 成功处理数据量

View File

@ -16,7 +16,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.XCode" Version="11.11.2024.417-beta0711" />
<PackageReference Include="NewLife.XCode" Version="11.12.2024.507" />
</ItemGroup>
<ItemGroup>