This commit is contained in:
2020-06-05 19:25:00 +00:00
parent 3111f7fdb7
commit ac3bfb50bf
3 changed files with 135 additions and 227 deletions

View File

@@ -19,23 +19,6 @@ namespace AyaNova.Biz
#region JOB OPS
/// <summary>
/// Get a non tracked list of jobs for an object
/// </summary>
/// <param name="ayObj"></param>
///
/// <returns></returns>
internal static async Task<List<OpsJob>> GetJobsForObjectAsync(AyaTypeId ayObj)
{
var ct = ServiceProviderProvider.DBContext;
return await ct.OpsJob
.AsNoTracking()
.Where(z => z.ObjectId == ayObj.ObjectId && z.ObjectType == ayObj.ObjectType)
.OrderBy(z => z.Created)
.ToListAsync();
}
/// <summary>
/// Get a non tracked list of jobs that are ready to process and exclusive only
@@ -63,122 +46,39 @@ namespace AyaNova.Biz
/// <returns></returns>
private static async Task<List<OpsJob>> GetReadyJobsAsync(bool exclusiveOnly)
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
using (AyContext ct = ServiceProviderProvider.DBContext)
{
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
}
/// <summary>
/// Get a non tracked list of all jobs that are not completed
/// could be running or sleeping
/// </summary>
/// <returns></returns>
internal static async Task<List<OpsJob>> GetAllSleepingOrRunningJobsAsync()
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.JobStatus == JobStatus.Sleeping || z.JobStatus == JobStatus.Running)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
/// <summary>
/// Get a non tracked list of all jobs for a JobType
/// </summary>
/// <returns></returns>
internal static async Task<List<OpsJob>> GetAllJobsForJobTypeAsync(JobType jobType)
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.JobType == jobType)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
/// <summary>
/// Get a non tracked list of all jobs that are status running but have no last activity for XX HOURS
/// </summary>
/// <returns></returns>
internal static async Task<List<OpsJob>> GetPotentiallyDeadRunningJobsAsync()
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.AsNoTracking()
.Where(z => z.JobStatus == JobStatus.Sleeping || z.JobStatus == JobStatus.Running)
.OrderBy(z => z.Created)
.ToListAsync();
return ret;
}
/// <summary>
/// Get a count of all jobs for a JobStatus
/// </summary>
/// <returns></returns>
internal static async Task<long> GetCountForJobStatusAsync(JobStatus jobStatus)
{
var ct = ServiceProviderProvider.DBContext;
var ret = await ct.OpsJob
.Where(z => z.JobStatus == jobStatus)
.LongCountAsync();
return ret;
}
/// <summary>
/// Add a new job to the database
/// </summary>
/// <param name="newJob"></param>
/// <returns></returns>
internal static async Task<OpsJob> AddJobAsync(OpsJob newJob)
internal static async Task AddJobAsync(OpsJob newJob)
{
var ct = ServiceProviderProvider.DBContext;
await ct.OpsJob.AddAsync(newJob);
await ct.SaveChangesAsync();
return newJob;
}
/// <summary>
/// Remove any jobs or logs for the object in question
/// </summary>
/// <param name="ayObj"></param>
internal static async Task DeleteJobsForObjectAsync(AyaTypeId ayObj)
{
//Get a list of all jobid's for the object passed in
List<OpsJob> jobsForObject = await GetJobsForObjectAsync(ayObj);
if (jobsForObject.Count == 0)
return;
foreach (OpsJob jobToBeDeleted in jobsForObject)
using (AyContext ct = ServiceProviderProvider.DBContext)
{
await RemoveJobAndLogsAsync(jobToBeDeleted.GId);
await ct.OpsJob.AddAsync(newJob);
await ct.SaveChangesAsync();
}
}
/// <summary>
/// REmove the job and it's logs
/// Remove the job and it's logs
/// </summary>
/// <param name="jobIdToBeDeleted"></param>
internal static async Task RemoveJobAndLogsAsync(Guid jobIdToBeDeleted)
{
var ct = ServiceProviderProvider.DBContext;
using (AyContext ct = ServiceProviderProvider.DBContext)
using (var transaction = await ct.Database.BeginTransactionAsync())
{
try
@@ -205,18 +105,18 @@ namespace AyaNova.Biz
/// </summary>
/// <param name="jobId">(NOTE: Guid.empty indicates internal job)</param>
/// <param name="statusText"></param>
///
internal static async Task<OpsJobLog> LogJobAsync(Guid jobId, string statusText)
internal static async Task LogJobAsync(Guid jobId, string statusText)
{
var ct = ServiceProviderProvider.DBContext;
if (string.IsNullOrWhiteSpace(statusText))
statusText = "No status provided";
OpsJobLog newObj = new OpsJobLog();
newObj.JobId = jobId;
newObj.StatusText = statusText;
await ct.OpsJobLog.AddAsync(newObj);
await ct.SaveChangesAsync();
return newObj;
using (AyContext ct = ServiceProviderProvider.DBContext)
{
if (string.IsNullOrWhiteSpace(statusText))
statusText = "No status provided";
OpsJobLog newObj = new OpsJobLog();
newObj.JobId = jobId;
newObj.StatusText = statusText;
await ct.OpsJobLog.AddAsync(newObj);
await ct.SaveChangesAsync();
}
}
@@ -225,14 +125,15 @@ namespace AyaNova.Biz
/// </summary>
/// <param name="jobId"></param>
/// <param name="newStatus"></param>
internal static async Task<OpsJob> UpdateJobStatusAsync(Guid jobId, JobStatus newStatus)
internal static async Task UpdateJobStatusAsync(Guid jobId, JobStatus newStatus)
{
var ct = ServiceProviderProvider.DBContext;
var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
if (oFromDb == null) return null;
oFromDb.JobStatus = newStatus;
await ct.SaveChangesAsync();
return oFromDb;
using (AyContext ct = ServiceProviderProvider.DBContext)
{
var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
if (oFromDb == null) return;
oFromDb.JobStatus = newStatus;
await ct.SaveChangesAsync();
}
}
#endregion Job ops
@@ -295,8 +196,8 @@ namespace AyaNova.Biz
//backup
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing backup");
await CoreJobBackup.DoWorkAsync();//sb exclusive
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
//Capture metrics
CoreJobMetricsSnapshot.DoJob();
@@ -312,7 +213,7 @@ namespace AyaNova.Biz
try
{
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing NON-exclusive biz job {j.Name}");
TaskUtil.Forget(Task.Run(() => ProcessJobAsync(j)));
TaskUtil.Forget(Task.Run(() => ProcessJobAsync(j)));
}
catch (Exception ex)
{
@@ -323,14 +224,14 @@ namespace AyaNova.Biz
}
}
//Capture metrics
CoreJobMetricsSnapshot.DoJob();
//TODO: NOTIFICATIONS
}
}
catch (Exception ex)
{
log.LogError(ex, "JobsBiz::ProcessJobsAsync unexpected error during processing");