Improve QueueService

This commit is contained in:
Laura Hausmann 2024-01-25 03:29:15 +01:00
parent bf3e72da9b
commit 7f8d2e2012
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -13,7 +13,7 @@ public class QueueService(ILogger<QueueService> logger, IServiceScopeFactory ser
while (!token.IsCancellationRequested) { while (!token.IsCancellationRequested) {
foreach (var _ in _queues.Select(queue => queue.Tick(serviceScopeFactory, token))) { } foreach (var _ in _queues.Select(queue => queue.Tick(serviceScopeFactory, token))) { }
await Task.Delay(1000, token); await Task.Delay(100, token);
} }
} }
} }
@ -41,6 +41,7 @@ public class JobQueue<T>(string name, Func<T, IServiceProvider, CancellationToke
private async Task ProcessJob(IServiceScopeFactory scopeFactory, CancellationToken token) { private async Task ProcessJob(IServiceScopeFactory scopeFactory, CancellationToken token) {
if (!_queue.TryDequeue(out var job)) return; if (!_queue.TryDequeue(out var job)) return;
job.Status = Job.JobStatus.Running; job.Status = Job.JobStatus.Running;
job.StartedAt = DateTime.Now;
var scope = scopeFactory.CreateScope(); var scope = scopeFactory.CreateScope();
try { try {
await handler(job, scope.ServiceProvider, token); await handler(job, scope.ServiceProvider, token);
@ -66,7 +67,8 @@ public class JobQueue<T>(string name, Func<T, IServiceProvider, CancellationToke
job.FinishedAt = DateTime.Now; job.FinishedAt = DateTime.Now;
var logger = scope.ServiceProvider.GetRequiredService<ILogger<QueueService>>(); var logger = scope.ServiceProvider.GetRequiredService<ILogger<QueueService>>();
logger.LogTrace("Job in queue {queue} completed after {ms} ms", name, job.Duration); logger.LogTrace("Job in queue {queue} completed after {duration} ms, was queued for {queueDuration} ms",
name, job.Duration, job.QueueDuration);
} }
scope.Dispose(); scope.Dispose();
@ -98,12 +100,15 @@ public abstract class Job {
} }
public DateTime? DelayedUntil; public DateTime? DelayedUntil;
public Exception? Exception; public Exception? Exception;
public DateTime? FinishedAt; public DateTime? FinishedAt;
public DateTime QueuedAt = DateTime.Now; public DateTime QueuedAt = DateTime.Now;
public DateTime? StartedAt;
public JobStatus Status = JobStatus.Queued; public JobStatus Status = JobStatus.Queued;
public long Duration => (long)((FinishedAt ?? DateTime.Now) - QueuedAt).TotalMilliseconds; public long Duration => (long)((FinishedAt ?? DateTime.Now) - (StartedAt ?? QueuedAt)).TotalMilliseconds;
public long QueueDuration => (long)((StartedAt ?? DateTime.Now) - QueuedAt).TotalMilliseconds;
} }
//TODO: handle delayed jobs //TODO: handle delayed jobs