9 changed files with 353 additions and 1 deletions
@ -0,0 +1,8 @@ |
|||
using System.Collections; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace LINGYUN.Abp.BackgroundTasks; |
|||
public interface IJobDispatcherSelectorList : IList<JobTypeSelector>, ICollection<JobTypeSelector>, IEnumerable<JobTypeSelector>, IEnumerable |
|||
{ |
|||
|
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace LINGYUN.Abp.BackgroundTasks; |
|||
public class JobDispatcherSelectorList : List<JobTypeSelector>, IJobDispatcherSelectorList |
|||
{ |
|||
|
|||
} |
|||
@ -0,0 +1,122 @@ |
|||
using JetBrains.Annotations; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Volo.Abp; |
|||
|
|||
namespace LINGYUN.Abp.BackgroundTasks; |
|||
public static class JobDispatcherSelectorListExtensions |
|||
{ |
|||
public const string AllJobssSelectorName = "All"; |
|||
|
|||
public static void AddNamespace( |
|||
[NotNull] this IJobDispatcherSelectorList selectors, |
|||
[NotNull] string namespaceName, |
|||
[CanBeNull] Action<JobTypeSelector> setup = null) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Namespace:" + namespaceName; |
|||
if (selectors.Any(s => s.Name == selectorName)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var selector = new JobTypeSelector(selectorName, t => t.FullName?.StartsWith(namespaceName) ?? false); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static void Add<TJob>([NotNull] this IJobDispatcherSelectorList selectors, [CanBeNull] Action<JobTypeSelector> setup = null) |
|||
where TJob : IJobRunnable |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Job:" + typeof(TJob).FullName; |
|||
if (selectors.Any(s => s.Name == selectorName)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var selector = new JobTypeSelector(selectorName, t => typeof(TJob).IsAssignableFrom(t)); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static void Remove<TJob>([NotNull] this IJobDispatcherSelectorList selectors) |
|||
where TJob : IJobRunnable |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Job:" + typeof(TJob).FullName; |
|||
selectors.RemoveAll(s => s.Name == selectorName); |
|||
} |
|||
|
|||
public static void AddAll([NotNull] this IJobDispatcherSelectorList selectors, [CanBeNull] Action<JobTypeSelector> setup = null) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
if (selectors.Any(s => s.Name == AllJobssSelectorName)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var selector = new JobTypeSelector(AllJobssSelectorName, t => typeof(IJobRunnable).IsAssignableFrom(t)); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static void Add( |
|||
[NotNull] this IJobDispatcherSelectorList selectors, |
|||
string selectorName, |
|||
Func<Type, bool> predicate, |
|||
[CanBeNull] Action<JobTypeSelector> setup = null) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
if (selectors.Any(s => s.Name == selectorName)) |
|||
{ |
|||
throw new AbpException($"There is already a selector added before with the same name: {selectorName}"); |
|||
} |
|||
|
|||
var selector = new JobTypeSelector(selectorName, predicate); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static void Add( |
|||
[NotNull] this IJobDispatcherSelectorList selectors, |
|||
Func<Type, bool> predicate, |
|||
[CanBeNull] Action<JobTypeSelector> setup = null) |
|||
{ |
|||
var selector = new JobTypeSelector(Guid.NewGuid().ToString("N"), predicate); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static bool RemoveByName( |
|||
[NotNull] this IJobDispatcherSelectorList selectors, |
|||
[NotNull] string name) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
Check.NotNull(name, nameof(name)); |
|||
|
|||
return selectors.RemoveAll(s => s.Name == name).Count > 0; |
|||
} |
|||
|
|||
public static bool IsMatch([NotNull] this IJobDispatcherSelectorList selectors, Type jobType) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
return selectors.Any(s => s.Predicate(jobType)); |
|||
} |
|||
} |
|||
@ -0,0 +1,61 @@ |
|||
using System; |
|||
using Volo.Abp; |
|||
|
|||
namespace LINGYUN.Abp.BackgroundTasks; |
|||
public class JobTypeSelector : NamedTypeSelector |
|||
{ |
|||
public JobTypeSelector( |
|||
string name, |
|||
Func<Type, bool> predicate, |
|||
int lockTimeOut = 0, |
|||
string nodeName = null, |
|||
string cron = null, |
|||
JobPriority priority = JobPriority.Normal, |
|||
int interval = 300, |
|||
int tryCount = 0, |
|||
int maxTryCount = 50) |
|||
: base(name, predicate) |
|||
{ |
|||
LockTimeOut = lockTimeOut; |
|||
NodeName = nodeName; |
|||
Cron = cron; |
|||
Priority = priority; |
|||
Interval = interval; |
|||
TryCount = tryCount; |
|||
MaxTryCount = maxTryCount; |
|||
} |
|||
|
|||
|
|||
|
|||
/// <summary>
|
|||
/// 任务独占超时时长(秒)
|
|||
/// 0或更小不生效
|
|||
/// </summary>
|
|||
public int LockTimeOut { get; set; } |
|||
/// <summary>
|
|||
/// 指定运行节点
|
|||
/// </summary>
|
|||
public string NodeName { get; set; } |
|||
/// <summary>
|
|||
/// 任务优先级
|
|||
/// </summary>
|
|||
public JobPriority Priority { get; set; } = JobPriority.Normal; |
|||
/// <summary>
|
|||
/// Cron表达式,如果是周期性任务需要指定
|
|||
/// </summary>
|
|||
public string Cron { get; set; } |
|||
/// <summary>
|
|||
/// 间隔时间,单位秒,与Cron表达式冲突
|
|||
/// 默认: 300
|
|||
/// </summary>
|
|||
public int Interval { get; set; } = 300; |
|||
/// <summary>
|
|||
/// 失败重试次数
|
|||
/// </summary>
|
|||
public int TryCount { get; set; } |
|||
/// <summary>
|
|||
/// 失败重试上限
|
|||
/// 默认:50
|
|||
/// </summary>
|
|||
public int MaxTryCount { get; set; } = 50; |
|||
} |
|||
@ -0,0 +1,81 @@ |
|||
using JetBrains.Annotations; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Volo.Abp; |
|||
using Volo.Abp.BackgroundJobs; |
|||
using Volo.Abp.BackgroundWorkers; |
|||
|
|||
namespace LINGYUN.Abp.BackgroundTasks; |
|||
public static class JobDispatcherSelectorListExtensions |
|||
{ |
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <typeparam name="TJob"></typeparam>
|
|||
/// <param name="selectors"></param>
|
|||
/// <param name="setup"></param>
|
|||
/// <remarks>
|
|||
/// Tips: 仅作用于适用于<see cref="IBackgroundJobManager" /> 接口的作业预配置
|
|||
/// </remarks>
|
|||
public static void AddJob<TJob>([NotNull] this IJobDispatcherSelectorList selectors, [CanBeNull] Action<JobTypeSelector> setup = null) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Job:" + typeof(TJob).FullName; |
|||
if (selectors.Any(s => s.Name == selectorName)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var selector = new JobTypeSelector(selectorName, t => typeof(TJob).IsAssignableFrom(t)); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static void RemoveJob<TJob>([NotNull] this IJobDispatcherSelectorList selectors) |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Job:" + typeof(TJob).FullName; |
|||
selectors.RemoveAll(s => s.Name == selectorName); |
|||
} |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <typeparam name="TWorker"></typeparam>
|
|||
/// <param name="selectors"></param>
|
|||
/// <param name="setup"></param>
|
|||
/// <remarks>
|
|||
/// Tips: 仅作用于适用于<see cref="IBackgroundWorker" /> 接口的作业预配置
|
|||
/// </remarks>
|
|||
public static void AddWorker<TWorker>([NotNull] this IJobDispatcherSelectorList selectors, [CanBeNull] Action<JobTypeSelector> setup = null) |
|||
where TWorker : IBackgroundWorker |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Worker:" + typeof(TWorker).FullName; |
|||
if (selectors.Any(s => s.Name == selectorName)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var selector = new JobTypeSelector(selectorName, t => typeof(TWorker).IsAssignableFrom(t)); |
|||
|
|||
setup?.Invoke(selector); |
|||
|
|||
selectors.Add(selector); |
|||
} |
|||
|
|||
public static void RemoveWorker<TWorker>([NotNull] this IJobDispatcherSelectorList selectors) |
|||
where TWorker : IBackgroundWorker |
|||
{ |
|||
Check.NotNull(selectors, nameof(selectors)); |
|||
|
|||
var selectorName = "Worker:" + typeof(TWorker).FullName; |
|||
selectors.RemoveAll(s => s.Name == selectorName); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue