@@ -12,6 +12,7 @@ namespace LinkDotNet.Blog.Web.Features;
1212
1313public sealed partial class TransformBlogPostRecordsService : IJob
1414{
15+ private static readonly SemaphoreSlim Semaphore = new ( 1 , 1 ) ;
1516 private readonly IRepository < BlogPost > blogPostRepository ;
1617 private readonly IRepository < UserRecord > userRecordRepository ;
1718 private readonly IRepository < BlogPostRecord > blogPostRecordRepository ;
@@ -31,9 +32,25 @@ public TransformBlogPostRecordsService(
3132
3233 public async Task RunAsync ( JobExecutionContext context , CancellationToken token )
3334 {
34- LogTransformStarted ( ) ;
35- await TransformRecordsAsync ( ) ;
36- LogTransformStopped ( ) ;
35+ // In the future version of NCronJob we don't need this here,
36+ // but can configure it via the AddCronJob method or similar ways
37+ var hasLock = await Semaphore . WaitAsync ( 0 , token ) ;
38+ if ( ! hasLock )
39+ {
40+ LogSkippingRun ( ) ;
41+ return ;
42+ }
43+
44+ try
45+ {
46+ LogTransformStarted ( ) ;
47+ await TransformRecordsAsync ( ) ;
48+ LogTransformStopped ( ) ;
49+ }
50+ finally
51+ {
52+ Semaphore . Release ( ) ;
53+ }
3754 }
3855
3956 private static IEnumerable < BlogPostRecord > GetBlogPostRecords (
@@ -112,4 +129,7 @@ private async Task TransformRecordsAsync()
112129
113130 [ LoggerMessage ( Level = LogLevel . Information , Message = "Deleted records from UserRecord-Table" ) ]
114131 private partial void LogDeletedUserRecords ( ) ;
132+
133+ [ LoggerMessage ( Level = LogLevel . Information , Message = "There is already a running job. Skipping this run." ) ]
134+ private partial void LogSkippingRun ( ) ;
115135}
0 commit comments