数据时间使用DataTime,作为作业任务的标杆
This commit is contained in:
parent
fc991790de
commit
522df07bed
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
||||
|
|
|
@ -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="服务器" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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;
|
||||
|
||||
// 区间无效
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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(""),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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("");
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -21,7 +21,7 @@ public partial class JobModel
|
|||
|
||||
/// <summary>数据时间。定时调度的执行时间点,或者数据调度的开始时间</summary>
|
||||
[XmlAttribute]
|
||||
public DateTime Time { get; set; }
|
||||
public DateTime DataTime { get; set; }
|
||||
|
||||
/// <summary>结束。小于</summary>
|
||||
[XmlAttribute]
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
// 成功处理数据量
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue