@@ -12,6 +12,7 @@ namespace LinkDotNet.Blog.Web.Features;
12
12
13
13
public sealed partial class TransformBlogPostRecordsService : IJob
14
14
{
15
+ private static readonly SemaphoreSlim Semaphore = new ( 1 , 1 ) ;
15
16
private readonly IRepository < BlogPost > blogPostRepository ;
16
17
private readonly IRepository < UserRecord > userRecordRepository ;
17
18
private readonly IRepository < BlogPostRecord > blogPostRecordRepository ;
@@ -31,9 +32,25 @@ public TransformBlogPostRecordsService(
31
32
32
33
public async Task RunAsync ( JobExecutionContext context , CancellationToken token )
33
34
{
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
+ }
37
54
}
38
55
39
56
private static IEnumerable < BlogPostRecord > GetBlogPostRecords (
@@ -112,4 +129,7 @@ private async Task TransformRecordsAsync()
112
129
113
130
[ LoggerMessage ( Level = LogLevel . Information , Message = "Deleted records from UserRecord-Table" ) ]
114
131
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 ( ) ;
115
135
}
0 commit comments