From 859c863c854e4a54de94543b1a49aa8ecc4b2ab0 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jul 2024 15:46:01 +0800 Subject: [PATCH 1/6] Set RecurringJobId by default for Hangfire --- .../Hangfire/HangfireBackgroundWorkerBase.cs | 4 +- .../HangfireBackgroundWorkerManager.cs | 42 ++++++++++--------- ...HangfirePeriodicBackgroundWorkerAdapter.cs | 11 +++-- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs index e5cef1ce42..3432c2deed 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Hangfire.States; namespace Volo.Abp.BackgroundWorkers.Hangfire; @@ -19,6 +20,7 @@ public abstract class HangfireBackgroundWorkerBase : BackgroundWorkerBase, IHang protected HangfireBackgroundWorkerBase() { TimeZone = null; - Queue = "default"; + Queue = EnqueuedState.DefaultQueue; + TimeZone = TimeZoneInfo.Utc; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index db993022ce..59fbf370ee 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -1,8 +1,10 @@ using System; +using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Hangfire; +using Hangfire.Common; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; @@ -35,39 +37,41 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet case IHangfireBackgroundWorker hangfireBackgroundWorker: { var unProxyWorker = ProxyHelper.UnProxy(hangfireBackgroundWorker); - if (hangfireBackgroundWorker.RecurringJobId.IsNullOrWhiteSpace()) - { - RecurringJob.AddOrUpdate( - () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(cancellationToken), - hangfireBackgroundWorker.CronExpression, hangfireBackgroundWorker.TimeZone, - hangfireBackgroundWorker.Queue); - } - else - { - RecurringJob.AddOrUpdate(hangfireBackgroundWorker.RecurringJobId, - () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(cancellationToken), - hangfireBackgroundWorker.CronExpression, hangfireBackgroundWorker.TimeZone, - hangfireBackgroundWorker.Queue); - } + + RecurringJob.AddOrUpdate( + hangfireBackgroundWorker.RecurringJobId, + hangfireBackgroundWorker.Queue, + () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(cancellationToken), + hangfireBackgroundWorker.CronExpression, + new RecurringJobOptions + { + TimeZone = hangfireBackgroundWorker.TimeZone + }); break; } case AsyncPeriodicBackgroundWorkerBase or PeriodicBackgroundWorkerBase: { - var timer = worker.GetType() - .GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); - + var timer = worker.GetType().GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); var period = worker is AsyncPeriodicBackgroundWorkerBase ? ((AbpAsyncTimer?)timer)?.Period : ((AbpTimer?)timer)?.Period; if (period == null) { return; } - + var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); var workerAdapter = (Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker)!; - RecurringJob.AddOrUpdate(() => workerAdapter.DoWorkAsync(cancellationToken), GetCron(period.Value), workerAdapter.TimeZone, workerAdapter.Queue); + RecurringJob.AddOrUpdate( + workerAdapter.RecurringJobId, + workerAdapter.Queue, + () => workerAdapter.DoWorkAsync(cancellationToken), + GetCron(period.Value), + new RecurringJobOptions + { + TimeZone = workerAdapter.TimeZone + }); break; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs index d624966fe4..faff49b3a9 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -13,9 +14,11 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou public HangfirePeriodicBackgroundWorkerAdapter() { - _doWorkAsyncMethod = - typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic)!; + _doWorkAsyncMethod = typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic)!; _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic)!; + + TimeZone = TimeZoneInfo.Utc; + RecurringJobId = typeof(TWorker).Name; } public async override Task DoWorkAsync(CancellationToken cancellationToken = default) @@ -33,4 +36,6 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou break; } } + + } From 456845bc9e0e1c5f65c946ada1c9474468af7b83 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jul 2024 15:49:52 +0800 Subject: [PATCH 2/6] Update HangfireBackgroundWorkerManager.cs --- .../Hangfire/HangfireBackgroundWorkerManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 59fbf370ee..9db6ff3501 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -1,10 +1,8 @@ using System; -using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Hangfire; -using Hangfire.Common; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; From 2197f735d1746f04208d43508f2ff140b3121030 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jul 2024 15:50:51 +0800 Subject: [PATCH 3/6] Update HangfireBackgroundWorkerBase --- .../BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs | 2 +- .../Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs index 3432c2deed..f3f83eb563 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs @@ -19,7 +19,7 @@ public abstract class HangfireBackgroundWorkerBase : BackgroundWorkerBase, IHang protected HangfireBackgroundWorkerBase() { - TimeZone = null; + TimeZone = TimeZoneInfo.Utc; Queue = EnqueuedState.DefaultQueue; TimeZone = TimeZoneInfo.Utc; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs index faff49b3a9..65fc4ecab1 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs @@ -16,8 +16,6 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou { _doWorkAsyncMethod = typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic)!; _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic)!; - - TimeZone = TimeZoneInfo.Utc; RecurringJobId = typeof(TWorker).Name; } From 1d657d6b93803d31bade58d0f0e97222d73fe237 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jul 2024 15:52:54 +0800 Subject: [PATCH 4/6] Update HangfireBackgroundWorkerBase.cs --- .../Hangfire/HangfireBackgroundWorkerBase.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs index f3f83eb563..0c1a5f3d26 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs @@ -11,16 +11,9 @@ public abstract class HangfireBackgroundWorkerBase : BackgroundWorkerBase, IHang public string CronExpression { get; set; } = default!; - public TimeZoneInfo? TimeZone { get; set; } + public TimeZoneInfo? TimeZone { get; set; } = TimeZoneInfo.Utc; - public string Queue { get; set; } + public string Queue { get; set; } = EnqueuedState.DefaultQueue; public abstract Task DoWorkAsync(CancellationToken cancellationToken = default); - - protected HangfireBackgroundWorkerBase() - { - TimeZone = TimeZoneInfo.Utc; - Queue = EnqueuedState.DefaultQueue; - TimeZone = TimeZoneInfo.Utc; - } } From 80579e6d74471a613a4833fcde9c01ffb38da562 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 29 Jul 2024 11:12:25 +0800 Subject: [PATCH 5/6] Add BackgroundWorkerNameAttribute --- .../HangfireBackgroundWorkerManager.cs | 31 ++++++++++---- ...HangfirePeriodicBackgroundWorkerAdapter.cs | 2 +- .../QuartzPeriodicBackgroundWorkerAdapter.cs | 13 ++---- .../BackgroundWorkerNameAttribute.cs | 42 +++++++++++++++++++ .../IBackgroundWorkerNameProvider.cs | 6 +++ 5 files changed, 74 insertions(+), 20 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerNameAttribute.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerNameProvider.cs diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 9db6ff3501..f778774018 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -61,15 +61,28 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); var workerAdapter = (Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker)!; - RecurringJob.AddOrUpdate( - workerAdapter.RecurringJobId, - workerAdapter.Queue, - () => workerAdapter.DoWorkAsync(cancellationToken), - GetCron(period.Value), - new RecurringJobOptions - { - TimeZone = workerAdapter.TimeZone - }); + if (workerAdapter.RecurringJobId.IsNullOrWhiteSpace()) + { + RecurringJob.AddOrUpdate( + workerAdapter.Queue, + () => workerAdapter.DoWorkAsync(cancellationToken), + GetCron(period.Value), + workerAdapter.TimeZone); + } + else + { + + RecurringJob.AddOrUpdate( + workerAdapter.RecurringJobId, + workerAdapter.Queue, + () => workerAdapter.DoWorkAsync(cancellationToken), + GetCron(period.Value), + new RecurringJobOptions + { + TimeZone = workerAdapter.TimeZone + }); + } + break; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs index 65fc4ecab1..9553bf12fc 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs @@ -16,7 +16,7 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou { _doWorkAsyncMethod = typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic)!; _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic)!; - RecurringJobId = typeof(TWorker).Name; + RecurringJobId = BackgroundWorkerNameAttribute.GetNameOrNull(); } public async override Task DoWorkAsync(CancellationToken cancellationToken = default) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs index 767ac36412..522ef7a807 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs @@ -39,14 +39,7 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo var timer = workerType.GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); - if (worker is AsyncPeriodicBackgroundWorkerBase) - { - period = ((AbpAsyncTimer?)timer)?.Period; - } - else - { - period = ((AbpTimer?)timer)?.Period; - } + period = worker is AsyncPeriodicBackgroundWorkerBase ? ((AbpAsyncTimer?)timer)?.Period : ((AbpTimer?)timer)?.Period; } else { @@ -60,10 +53,10 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo JobDetail = JobBuilder .Create>() - .WithIdentity(workerType.FullName!) + .WithIdentity(BackgroundWorkerNameAttribute.GetName()) .Build(); Trigger = TriggerBuilder.Create() - .WithIdentity(workerType.FullName!) + .WithIdentity(BackgroundWorkerNameAttribute.GetName()) .WithSimpleSchedule(builder => builder.WithInterval(TimeSpan.FromMilliseconds(period.Value)).RepeatForever()) .Build(); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerNameAttribute.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerNameAttribute.cs new file mode 100644 index 0000000000..4fc8521dad --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerNameAttribute.cs @@ -0,0 +1,42 @@ +using System; +using System.Linq; + +namespace Volo.Abp.BackgroundWorkers; + +public class BackgroundWorkerNameAttribute : Attribute, IBackgroundWorkerNameProvider +{ + public string Name { get; } + + public BackgroundWorkerNameAttribute(string name) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } + + public static string GetName() + { + return GetName(typeof(TWorkerType)); + } + + public static string GetName(Type workerType) + { + Check.NotNull(workerType, nameof(workerType)); + + return GetNameOrNull(workerType) ?? workerType.FullName!; + } + + public static string? GetNameOrNull() + { + return GetNameOrNull(typeof(TWorkerType)); + } + + public static string? GetNameOrNull(Type workerType) + { + Check.NotNull(workerType, nameof(workerType)); + + return workerType + .GetCustomAttributes(true) + .OfType() + .FirstOrDefault() + ?.Name; + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerNameProvider.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerNameProvider.cs new file mode 100644 index 0000000000..8956a89c98 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerNameProvider.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.BackgroundWorkers; + +public interface IBackgroundWorkerNameProvider +{ + string Name { get; } +} \ No newline at end of file From 3dbf6cc7d65213514cb3230e5cbac398a476b8b7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 29 Jul 2024 13:23:53 +0800 Subject: [PATCH 6/6] Update HangfireBackgroundWorkerManager.cs --- .../Hangfire/HangfireBackgroundWorkerManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index f778774018..9c79056ec2 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -64,10 +64,10 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet if (workerAdapter.RecurringJobId.IsNullOrWhiteSpace()) { RecurringJob.AddOrUpdate( - workerAdapter.Queue, () => workerAdapter.DoWorkAsync(cancellationToken), GetCron(period.Value), - workerAdapter.TimeZone); + workerAdapter.TimeZone , + workerAdapter.Queue); } else {