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