using Abp.BackgroundJobs;
using Abp.Dependency;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Timing;
namespace VberZero.BackgroundJobs;
///
/// 实现 存储库
///
public class BackgroundJobStore : IBackgroundJobStore, ITransientDependency
{
private readonly IRepository _backgroundJobRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public BackgroundJobStore(
IRepository backgroundJobRepository,
IUnitOfWorkManager unitOfWorkManager)
{
_backgroundJobRepository = backgroundJobRepository;
_unitOfWorkManager = unitOfWorkManager;
}
public async Task GetAsync(long jobId)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
await _backgroundJobRepository.GetAsync(jobId)
);
}
public BackgroundJobInfo Get(long jobId)
{
return _unitOfWorkManager.WithUnitOfWork(() =>
_backgroundJobRepository.Get(jobId)
);
}
public async Task InsertAsync(BackgroundJobInfo jobInfo)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
await _backgroundJobRepository.InsertAsync(jobInfo)
);
}
public void Insert(BackgroundJobInfo jobInfo)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
_backgroundJobRepository.Insert(jobInfo);
});
}
public virtual async Task> GetWaitingJobsAsync(int maxResultCount)
{
var waitingJobs = _unitOfWorkManager.WithUnitOfWork(() =>
{
return _backgroundJobRepository.GetAll()
.Where(t => !t.IsAbandoned && t.NextTryTime <= Clock.Now)
.OrderByDescending(t => t.Priority)
.ThenBy(t => t.TryCount)
.ThenBy(t => t.NextTryTime)
.Take(maxResultCount)
.ToList();
});
return await Task.FromResult(waitingJobs);
}
public virtual List GetWaitingJobs(int maxResultCount)
{
return _unitOfWorkManager.WithUnitOfWork(() =>
{
return _backgroundJobRepository.GetAll()
.Where(t => !t.IsAbandoned && t.NextTryTime <= Clock.Now)
.OrderByDescending(t => t.Priority)
.ThenBy(t => t.TryCount)
.ThenBy(t => t.NextTryTime)
.Take(maxResultCount)
.ToList();
});
}
public async Task DeleteAsync(BackgroundJobInfo jobInfo)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
await _backgroundJobRepository.DeleteAsync(jobInfo)
);
}
public void Delete(BackgroundJobInfo jobInfo)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
_backgroundJobRepository.Delete(jobInfo);
});
}
public async Task UpdateAsync(BackgroundJobInfo jobInfo)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
await _backgroundJobRepository.UpdateAsync(jobInfo)
);
}
public void Update(BackgroundJobInfo jobInfo)
{
_unitOfWorkManager.WithUnitOfWork(() =>
{
_backgroundJobRepository.Update(jobInfo);
});
}
}