Hangfire сохраняются локальные рамки - PullRequest
0 голосов
/ 11 января 2020

Я хотел бы использовать Hangfire для создания долгого огня и забыть задачу. Если веб-сервер умирает, а фоновое задание повторяется, я бы хотел, чтобы он продолжал с того места, где он остановился.

В приведенном ниже примере предположим, что foo.RetryCount достигает 3 -> сервер перезапускается -> Hangfire перезапускает работу В этом случае я бы хотел выполнить задачу еще 7 раз (на основе MaxAttemps), вместо перезапуска с нуля.

Я думал, что Hangfire сохранил аргументы, переданные методу в их текущем состоянии, но насколько я могу судить, они сброшены.

var foo = new Foo { RetryCount = 0, MaxAttemps = 10 };
BackgroundJob.Enqueue(() => RequestAndRetryOnFailure(foo));

void RequestAndRetryOnFailure(Foo foo) 
{
    // make request to server, if fail, wait for a 
    // while and try again later if not foo.MaxAttemps is reached
    foo.RetryCount++;
}

1 Ответ

1 голос
/ 11 января 2020

Я широко использую Hangfire для множества различных действий и постоянно нуждаюсь в перепланировании задания, которое началось, но не может быть выполнено из-за определенных ограничений.

Постоянство, на которое вы ссылаетесь, происходит в сериализованном виде версия задания, которое ставится в очередь, но больше не сохраняется после его выполнения.

Я бы порекомендовал запланировать выполнение задания после определенной суммы, если сервер недоступен. Это также поможет перезапустить задание, если задание запланировано и перезагрузка зависает.

var foo = new Foo { RetryCount = 0, MaxAttemps = 10 };
BackgroundJob.Enqueue(() => RequestAndRetryOnFailure(foo));

void RequestAndRetryOnFailure(Foo foo) 
{
    // make request to server, if fail, wait for a 
    // while and try again later if not foo.MaxAttemps is reached
    if (request to server failed) 
    {
        foo.RetryCount ++;
        If (foo.RetryCount < foo.MaxAttempts)
            BackgroundJob.Schedule(RequestAndRetryOnFailure(foo), Timespan.FromSeconds(30));
        else
             return; // do nothing
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...