45

I am looking at using Hangfire as a job scheduler for recurring jobs. So configuring them is simple with AddOrUpdate, but then how do i delete it? I don't want to pollute my code with RecurringJob.RemoveIfExists() when that job has been deleted and then have to remember to delete it later.

Is there a way to get a list of all recurring jobs and delete them when the server starts and so my code will re add them in every time? If not, if there a better way?

e.g.

Application version 1: Added new Hangfire recurring job Do something 1

Application version 2: Added new Hangfire recurring jobs Do something 2 and Do Something 3

Application version 3: Removed Hangfire recurring job Do something 2

Problem: the job will still exist on the server with error "Could not load type..." and needs to be deleted.

lahsrah
  • 9,013
  • 5
  • 37
  • 67

3 Answers3

83

A bit late on this one but hopefully it will help someone else. I got stuck in the same situation. In the end the answer on HangFire recurring task data helped me out.

I use the JobStorage to loop through all recurring jobs and remove each in turn as below:

using (var connection = JobStorage.Current.GetConnection())
{
    foreach (var recurringJob in connection.GetRecurringJobs())
    {
        RecurringJob.RemoveIfExists(recurringJob.Id);
    }
}

I am sure there is a nicer way out there but I couldn't find it

Vadim Ovchinnikov
  • 13,327
  • 5
  • 62
  • 90
paul
  • 1,169
  • 8
  • 8
22

paul's answer was helpful but API api seems to have changed. Using Hangfire 1.6.20 I needed to get the recurring jobs from StorageConnectionExtensions

using (var connection = JobStorage.Current.GetConnection()) 
{
    foreach (var recurringJob in StorageConnectionExtensions.GetRecurringJobs(connection)) 
    {
        RecurringJob.RemoveIfExists(recurringJob.Id);
    }
}
brasofilo
  • 25,496
  • 15
  • 91
  • 179
nevh
  • 397
  • 2
  • 4
  • 3
    Need to add a `using Hangfire.Storage` at the top of the file, but yeah, this is what I needed to drop all recurring jobs. Thanks! – Gary Rogers Dec 27 '18 at 17:04
  • 8
    As the StorageConnectionExtensions class is self explanatory, the GetRecurringJobs() method is an extension method of the Connection object, so no need to call it via the static extension class, use connection.GetRecurringJobs() instead. – Francesco Mar 31 '20 at 08:40
2

according to hangfire docs

public static void RemoveIfExists(
    string recurringJobId
)

with this method, you can pass the job id which you want to delete.

RecurringJob.RemoveIfExists("exampleClassName.exampleFunctionName");
  • `I don't want to pollute my code with RecurringJob.RemoveIfExists() when that job has been deleted and then have to remember to delete it later.` – kamilz Aug 24 '23 at 19:10