using Abp.BackgroundJobs; using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.Extensions; using Abp.Threading.BackgroundWorkers; using Abp.Threading.Timers; using Abp.Timing; using VberZero.BaseSystem.MultiTenancy; using VberZero.BaseSystem.Users; namespace VberZero.Authorization.Users; /// /// UserToken 过期工作者 /// public class UserTokenExpirationWorker : PeriodicBackgroundWorkerBase { private readonly IRepository _userTokenRepository; private readonly IRepository _tenantRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; public UserTokenExpirationWorker( AbpTimer timer, IRepository userTokenRepository, IBackgroundJobConfiguration backgroundJobConfiguration, IUnitOfWorkManager unitOfWorkManager, IRepository tenantRepository) : base(timer) { _userTokenRepository = userTokenRepository; _unitOfWorkManager = unitOfWorkManager; _tenantRepository = tenantRepository; Timer.Period = backgroundJobConfiguration.UserTokenExpirationPeriod?.TotalMilliseconds.To() //?? backgroundJobConfiguration.CleanUserTokenPeriod ?? TimeSpan.FromHours(1).TotalMilliseconds.To(); } protected override void DoWork() { try { List tenantIds; var utcNow = Clock.Now.ToUniversalTime(); using (var uow = _unitOfWorkManager.Begin()) { using (_unitOfWorkManager.Current.SetTenantId(null)) { _userTokenRepository.Delete(t => t.ExpireDate <= utcNow); tenantIds = _tenantRepository.GetAll().Select(t => t.Id).ToList(); uow.Complete(); } } foreach (var tenantId in tenantIds) { using var uow = _unitOfWorkManager.Begin(); using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { _userTokenRepository.Delete(t => t.ExpireDate <= utcNow); uow.Complete(); } } } catch (Exception e) { Console.WriteLine(e); } } }