You can simply use a condition inside a recurring job and store it in your database to prevent job running:
public void MyMethod()
{
if (someCondition) { return; }
/* ... */
}
Or use filters to extend Hangfire as shown below (I haven’t tested the code):
public class CanBePausedAttribute : JobFilterAttribute, IServerFilter
{
public void OnPerforming(PerformingContext filterContext)
{
var values = filterContext.Connection.GetAllItemsFromSet("paused-jobs");
if (values.Contains(filterContext.Job.Type.Name))
{
filterContext.Canceled = true;
}
}
public void OnPerformed(PerformedContext filterContext)
{
}
}
public static class PauseJobStorageExtensions
{
public static void Pause(this IStorageConnection connection, Type type)
{
if (connection == null) throw new ArgumentNullException("connection");
if (type == null) throw new ArgumentNullException("type");
using (var transaction = connection.CreateWriteTransaction())
{
transaction.AddToSet("paused-jobs", type.Name);
transaction.Commit();
}
}
public static void Resume(this IStorageConnection connection, Type type)
{
if (connection == null) throw new ArgumentNullException("connection");
if (type == null) throw new ArgumentNullException("type");
using (var transaction = connection.CreateWriteTransaction())
{
transaction.RemoveFromSet("paused-jobs", type.Name);
transaction.Commit();
}
}
}
class Program
{
[CanBePaused]
static void Main()
{
var storage = new SqlServerStorage("connection_string");
var client = new BackgroundJobClient(storage);
client.Enqueue(() => Program.Main());
using (var connection = storage.GetConnection())
{
connection.Pause(typeof(Program));
connection.Resume(typeof(Program));
}
}
}