using RedLockNet;
namespace NetAdmin.Host.BackgroundRunning;
///
/// 工作基类
///
public abstract class WorkBase
{
private readonly RedLocker _redLocker;
///
/// Initializes a new instance of the class.
///
protected WorkBase()
{
ServiceProvider = App.GetService().CreateScope().ServiceProvider;
UowManager = ServiceProvider.GetService();
Logger = ServiceProvider.GetService>();
_redLocker = ServiceProvider.GetService();
}
///
/// 日志记录器
///
protected ILogger Logger { get; }
///
/// 服务提供器
///
protected IServiceProvider ServiceProvider { get; }
///
/// 事务单元管理器
///
protected UnitOfWorkManager UowManager { get; }
///
/// 获取锁
///
protected Task GetLockerAsync(string lockId)
{
return _redLocker.RedLockFactory.CreateLockAsync(lockId, TimeSpan.FromSeconds(Numbers.RED_LOCK_EXPIRY_TIME_SECS)
, TimeSpan.FromSeconds(Numbers.RED_LOCK_WAIT_TIME_SECS)
, TimeSpan.FromSeconds(Numbers.RED_LOCK_RETRY_TIME_SECS));
}
///
/// 通用工作流
///
protected abstract ValueTask WorkflowAsync(CancellationToken cancelToken);
///
/// 通用工作流
///
/// 加锁失败异常
protected async ValueTask WorkflowAsync(bool singleInstance, CancellationToken cancelToken)
{
if (singleInstance) {
// 加锁
await using var redLock = await GetLockerAsync(GetType().FullName).ConfigureAwait(false);
if (!redLock.IsAcquired) {
throw new NetAdminGetLockerException();
}
await WorkflowAsync(cancelToken).ConfigureAwait(false);
return;
}
await WorkflowAsync(cancelToken).ConfigureAwait(false);
}
}