Запретить HangFire запускать задание несколько раз на разных серверах? - PullRequest
0 голосов
/ 06 августа 2020

Я настроил повторяющееся задание, которое просто обрабатывает некоторые заказы:

                    {
                        RecurringJob.AddOrUpdate(
                            hangFireJob.JobId,
                            () => hangFireJob.Execute(),
                            hangFireJob.Schedule);
                    }

Проблема, с которой я сталкиваюсь, заключается в том, что у нас есть несколько «резервных» серверов, на которых работает один и тот же код. Все они обращаются к одной и той же базе данных HangFire.

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

Мне нужна резервная копия серверы, чтобы распознать, что повторяющееся задание уже поставлено в очередь, и не ставить его в очередь снова. Я решил, что для этого потребуется go в имени задания (первый параметр выше). Что мне здесь не хватает?

Я включил настройку сервера Hangfire ниже:

        private IEnumerable<IDisposable> GetHangfireServers()
        {
            var configSettings = new Settings();
            GlobalConfiguration.Configuration
                               .UseNinjectActivator(_kernel)
                               .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                               .UseSimpleAssemblyNameTypeSerializer()
                               .UseRecommendedSerializerSettings()
                               .UseSqlServerStorage(configSettings.HangfireConnectionString, new SqlServerStorageOptions
                               {
                                   CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                                   SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                                   QueuePollInterval = TimeSpan.Zero,
                                   UseRecommendedIsolationLevel = true,
                                   DisableGlobalLocks = false,
                                   SchemaName = "LuxAdapter",
                                   PrepareSchemaIfNecessary = false
                               });

            yield return new BackgroundJobServer();
        }```

1 Ответ

1 голос
/ 08 августа 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...