From 9b1af63adaa12369be125f68b4c9529d67ccf58e Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Thu, 21 Jul 2022 09:24:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E5=88=86=E7=89=87=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E7=AC=A6=E6=B3=A8=E9=87=8A=E8=BF=9B=E8=A1=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=92=8C=E5=AE=8C=E5=96=84,=E9=92=88=E5=AF=B9=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=88=86=E7=89=87=E6=97=B6=E9=97=B4=E7=9A=84=E8=A1=A5?= =?UTF-8?q?=E5=81=BF=EF=BC=8C=E9=98=B2=E6=AD=A2=E6=8F=90=E5=89=8D=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E8=A1=A8=E5=AF=BC=E8=87=B4=E9=87=8D=E5=90=AF=E5=90=8E?= =?UTF-8?q?=E5=86=85=E5=AD=98=E4=B8=AD=E5=8F=AF=E8=83=BD=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=88=86=E7=89=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TestYearShardingVirtualTableRoute.cs | 1 - .../Core/Collections/SafeReadAppendList.cs | 2 +- src/ShardingCore/Jobs/Abstaractions/IJob.cs | 2 +- src/ShardingCore/Jobs/Impls/JobEntry.cs | 14 ++++++++++++-- src/ShardingCore/Jobs/JobEntryFactory.cs | 6 +----- ...dingAutoCreateOperatorVirtualTableRoute.cs | 19 ++++++++++++++++++- ...ShardingDayKeyDateTimeVirtualTableRoute.cs | 5 +++++ ...mpleShardingDayKeyLongVirtualTableRoute.cs | 4 ++++ ...ardingMonthKeyDateTimeVirtualTableRoute.cs | 4 ++++ ...leShardingMonthKeyLongVirtualTableRoute.cs | 4 ++++ ...hardingWeekKeyDateTimeVirtualTableRoute.cs | 4 ++++ ...pleShardingWeekKeyLongVirtualTableRoute.cs | 4 ++++ ...hardingYearKeyDateTimeVirtualTableRoute.cs | 4 ++++ ...pleShardingYearKeyLongVirtualTableRoute.cs | 4 ++++ 14 files changed, 66 insertions(+), 11 deletions(-) diff --git a/samples/Sample.SqlServer/Shardings/TestYearShardingVirtualTableRoute.cs b/samples/Sample.SqlServer/Shardings/TestYearShardingVirtualTableRoute.cs index 24a98d24..3127770d 100644 --- a/samples/Sample.SqlServer/Shardings/TestYearShardingVirtualTableRoute.cs +++ b/samples/Sample.SqlServer/Shardings/TestYearShardingVirtualTableRoute.cs @@ -26,6 +26,5 @@ namespace Sample.SqlServer.Shardings { return true; } - } } diff --git a/src/ShardingCore/Core/Collections/SafeReadAppendList.cs b/src/ShardingCore/Core/Collections/SafeReadAppendList.cs index c4cb6539..0cf889b0 100644 --- a/src/ShardingCore/Core/Collections/SafeReadAppendList.cs +++ b/src/ShardingCore/Core/Collections/SafeReadAppendList.cs @@ -16,7 +16,7 @@ namespace ShardingCore.Core.Collections { } - public IReadOnlyList Data => _list; + public ImmutableList Data => _list; public void Append(T value) { diff --git a/src/ShardingCore/Jobs/Abstaractions/IJob.cs b/src/ShardingCore/Jobs/Abstaractions/IJob.cs index d194bae3..1394fdb6 100644 --- a/src/ShardingCore/Jobs/Abstaractions/IJob.cs +++ b/src/ShardingCore/Jobs/Abstaractions/IJob.cs @@ -7,7 +7,7 @@ namespace ShardingCore.Jobs.Abstaractions public interface IJob { string JobName { get; } - string[] GetCronExpressions(); + string[] GetJobCronExpressions(); Task ExecuteAsync(); bool AppendJob(); } diff --git a/src/ShardingCore/Jobs/Impls/JobEntry.cs b/src/ShardingCore/Jobs/Impls/JobEntry.cs index fc8bf929..2f072f84 100644 --- a/src/ShardingCore/Jobs/Impls/JobEntry.cs +++ b/src/ShardingCore/Jobs/Impls/JobEntry.cs @@ -15,6 +15,12 @@ namespace ShardingCore.Jobs.Impls */ public sealed class JobEntry { + public JobEntry(IJob job) + { + JobInstance = job; + JobName = job.JobName; + JobCronExpressions = job.GetJobCronExpressions(); + } /// /// 保证多线程只有一个清理操作 /// @@ -32,7 +38,7 @@ namespace ShardingCore.Jobs.Impls /// /// job实例 /// - public IJob JobInstance { get; set; } + public IJob JobInstance { get; } /// /// 是否跳过如果正在运行 @@ -43,6 +49,10 @@ namespace ShardingCore.Jobs.Impls /// 下次运行时间 /// public DateTime? NextUtcTime { get; set; } + /// + /// 任务的cron表达式 + /// + public string[] JobCronExpressions { get; } /// /// 是否正在运行 @@ -69,7 +79,7 @@ namespace ShardingCore.Jobs.Impls /// public void CalcNextUtcTime() { - this.NextUtcTime= JobInstance.GetCronExpressions().Select(cron => new CronExpression(cron).GetTimeAfter(DateTime.UtcNow)).Min(); + this.NextUtcTime= JobCronExpressions.Select(cron => new CronExpression(cron).GetTimeAfter(DateTime.UtcNow)).Min(); } } } \ No newline at end of file diff --git a/src/ShardingCore/Jobs/JobEntryFactory.cs b/src/ShardingCore/Jobs/JobEntryFactory.cs index d0622ebf..159142cf 100644 --- a/src/ShardingCore/Jobs/JobEntryFactory.cs +++ b/src/ShardingCore/Jobs/JobEntryFactory.cs @@ -17,11 +17,7 @@ namespace ShardingCore.Jobs public static JobEntry Create(IJob job) { - var jobEntry = new JobEntry() - { - JobInstance = job, - JobName = job.JobName, - }; + var jobEntry = new JobEntry(job); jobEntry.CalcNextUtcTime(); return jobEntry; } diff --git a/src/ShardingCore/VirtualRoutes/Abstractions/AbstractShardingAutoCreateOperatorVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Abstractions/AbstractShardingAutoCreateOperatorVirtualTableRoute.cs index 6911fc5c..f52170c1 100644 --- a/src/ShardingCore/VirtualRoutes/Abstractions/AbstractShardingAutoCreateOperatorVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Abstractions/AbstractShardingAutoCreateOperatorVirtualTableRoute.cs @@ -22,12 +22,17 @@ using ShardingCore.TableCreator; namespace ShardingCore.VirtualRoutes.Abstractions { + /// + /// 分片字段追加 + /// + /// + /// [ExcludeFromCodeCoverage] public abstract class AbstractShardingAutoCreateOperatorVirtualTableRoute : AbstractShardingOperatorVirtualTableRoute, ITailAppendable, IJob where TEntity : class { - private static readonly object APPEND_LOCK = new object(); + private readonly object APPEND_LOCK = new object(); private readonly SafeReadAppendList _tails = new SafeReadAppendList(); @@ -85,6 +90,17 @@ namespace ShardingCore.VirtualRoutes.Abstractions /// public virtual int IncrementMinutes => 10; + public string[] GetJobCronExpressions() + { + var cronExpressions = GetCronExpressions(); + var compensateCronExpressions = GetCompensateCronExpressions(); + return cronExpressions.Concat(compensateCronExpressions).Distinct().ToArray(); + } + /// + /// 补偿cron防止提前创建后没有添加tail到内存中从而无法识别 + /// + /// + public abstract string[] GetCompensateCronExpressions(); /// /// 重写改方法后请一起重写IncrementMinutes值,比如你按月分表但是你设置cron表达式为月中的时候建表, /// 那么会在月中的时候 DateTime.Now.AddMinutes(IncrementMinutes);来获取tail会导致还是当月的所以不会建表 @@ -99,6 +115,7 @@ namespace ShardingCore.VirtualRoutes.Abstractions /// protected abstract string ConvertNowToTail(DateTime now); + public virtual Task ExecuteAsync() { var logger=RouteShardingProvider diff --git a/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs index 70eba4d5..0c9e9d58 100644 --- a/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs @@ -85,5 +85,10 @@ namespace ShardingCore.VirtualRoutes.Days }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 * * ?" }; + } + } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyLongVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyLongVirtualTableRoute.cs index 9cb45be8..0c8d06be 100644 --- a/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyLongVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyLongVirtualTableRoute.cs @@ -80,5 +80,9 @@ namespace ShardingCore.VirtualRoutes.Days "0 1 0 * * ?", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 * * ?" }; + } } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute.cs index ff7a9054..94003354 100644 --- a/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyDateTimeVirtualTableRoute.cs @@ -76,6 +76,10 @@ namespace ShardingCore.VirtualRoutes.Months "0 1 0 1 * ?", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 1 * ?" }; + } } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyLongVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyLongVirtualTableRoute.cs index 8e2be5f8..af898568 100644 --- a/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyLongVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Months/AbstractSimpleShardingMonthKeyLongVirtualTableRoute.cs @@ -79,5 +79,9 @@ namespace ShardingCore.VirtualRoutes.Months "0 1 0 1 * ?", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 1 * ?" }; + } } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute.cs index 4bf6d5a0..3dff17bc 100644 --- a/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyDateTimeVirtualTableRoute.cs @@ -78,6 +78,10 @@ namespace ShardingCore.VirtualRoutes.Weeks "0 1 0 ? * 2", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 ? * 2" }; + } } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyLongVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyLongVirtualTableRoute.cs index 77b72ff9..449231e7 100644 --- a/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyLongVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Weeks/AbstractSimpleShardingWeekKeyLongVirtualTableRoute.cs @@ -81,5 +81,9 @@ namespace ShardingCore.VirtualRoutes.Weeks "0 1 0 ? * 2", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 ? * 2" }; + } } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute.cs index 06da670a..98279e3c 100644 --- a/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute.cs @@ -78,5 +78,9 @@ namespace ShardingCore.VirtualRoutes.Years "0 1 0 1 1 ?", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 1 1 ?" }; + } } } \ No newline at end of file diff --git a/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyLongVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyLongVirtualTableRoute.cs index e7cbbc53..a55832b6 100644 --- a/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyLongVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Years/AbstractSimpleShardingYearKeyLongVirtualTableRoute.cs @@ -102,5 +102,9 @@ namespace ShardingCore.VirtualRoutes.Years "0 1 0 1 1 ?", }; } + public override string[] GetCompensateCronExpressions() + { + return new[] { "0 0 0 1 1 ?" }; + } } } \ No newline at end of file