Forked from odinserj/SkipWhenPreviousJobIsRunningAttribute.cs
Last active
October 16, 2023 15:17
-
-
Save jmprado/5199e844a62057ec611e8091f0f453f4 to your computer and use it in GitHub Desktop.
SkipWhenPreviousJobIsRunningAttribute.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using Hangfire.Client; | |
using Hangfire.Common; | |
using Hangfire.States; | |
using Hangfire.Storage; | |
namespace ConsoleApp28 | |
{ | |
public class SkipWhenPreviousJobIsRunningAttribute : JobFilterAttribute, IClientFilter, IApplyStateFilter | |
{ | |
public void OnCreating(CreatingContext context) | |
{ | |
var connection = context.Connection as JobStorageConnection; | |
// We can't handle old storages | |
if (connection == null) return; | |
// We should run this filter only for background jobs based on | |
// recurring ones | |
if (!context.Parameters.ContainsKey("RecurringJobId")) return; | |
var recurringJobId = context.Parameters["RecurringJobId"] as string; | |
// RecurringJobId is malformed. This should not happen, but anyway. | |
if (String.IsNullOrWhiteSpace(recurringJobId)) return; | |
var running = connection.GetValueFromHash($"recurring-job:{recurringJobId}", "Running"); | |
if ("yes".Equals(running, StringComparison.OrdinalIgnoreCase)) | |
{ | |
context.Canceled = true; | |
} | |
} | |
public void OnCreated(CreatedContext filterContext) | |
{ | |
} | |
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction) | |
{ | |
if (context.NewState is EnqueuedState) | |
{ | |
var recurringJobId = SerializationHelper.Deserialize<string>(context.Connection.GetJobParameter(context.BackgroundJob.Id, "RecurringJobId")); | |
if (String.IsNullOrWhiteSpace(recurringJobId)) return; | |
transaction.SetRangeInHash( | |
$"recurring-job:{recurringJobId}", | |
new[] { new KeyValuePair<string, string>("Running", "yes") }); | |
} | |
else if (context.NewState.IsFinal) | |
{ | |
var recurringJobId = SerializationHelper.Deserialize<string>(context.Connection.GetJobParameter(context.BackgroundJob.Id, "RecurringJobId")); | |
if (String.IsNullOrWhiteSpace(recurringJobId)) return; | |
transaction.SetRangeInHash( | |
$"recurring-job:{recurringJobId}", | |
new []{ new KeyValuePair<string, string>("Running", "no") }); | |
} | |
} | |
public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction) | |
{ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment