From c31bb921b16e75ca32bd2ac9e79fe681110dc19f Mon Sep 17 00:00:00 2001 From: Steven Giesel Date: Fri, 22 Mar 2024 21:44:54 +0100 Subject: [PATCH] fix: Don't allow multiple runs --- .../TransformBlogPostRecordsService.cs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/LinkDotNet.Blog.Web/Features/TransformBlogPostRecordsService.cs b/src/LinkDotNet.Blog.Web/Features/TransformBlogPostRecordsService.cs index 59ec79bb..9fa0c65a 100644 --- a/src/LinkDotNet.Blog.Web/Features/TransformBlogPostRecordsService.cs +++ b/src/LinkDotNet.Blog.Web/Features/TransformBlogPostRecordsService.cs @@ -12,6 +12,7 @@ namespace LinkDotNet.Blog.Web.Features; public sealed partial class TransformBlogPostRecordsService : IJob { + private static readonly SemaphoreSlim Semaphore = new(1, 1); private readonly IRepository blogPostRepository; private readonly IRepository userRecordRepository; private readonly IRepository blogPostRecordRepository; @@ -31,9 +32,25 @@ public TransformBlogPostRecordsService( public async Task RunAsync(JobExecutionContext context, CancellationToken token) { - LogTransformStarted(); - await TransformRecordsAsync(); - LogTransformStopped(); + // In the future version of NCronJob we don't need this here, + // but can configure it via the AddCronJob method or similar ways + var hasLock = await Semaphore.WaitAsync(0, token); + if (!hasLock) + { + LogSkippingRun(); + return; + } + + try + { + LogTransformStarted(); + await TransformRecordsAsync(); + LogTransformStopped(); + } + finally + { + Semaphore.Release(); + } } private static IEnumerable GetBlogPostRecords( @@ -112,4 +129,7 @@ private async Task TransformRecordsAsync() [LoggerMessage(Level = LogLevel.Information, Message = "Deleted records from UserRecord-Table")] private partial void LogDeletedUserRecords(); + + [LoggerMessage(Level = LogLevel.Information, Message = "There is already a running job. Skipping this run.")] + private partial void LogSkippingRun(); }