Завершающие задания Hangfire не работают - выдается исключение: «Невозможно найти конструктор» - PullRequest
0 голосов
/ 20 марта 2020

У меня есть. net Core 2.1 веб-приложение с библиотекой Hangfire (1.7.9), работающей на postgres (12).

Я пытался добавить повторяющуюся работу, но каждый раз, когда Hangfire пытался запустить его, выдает исключение:

"Hangfire.Common.JobLoadException: не удалось загрузить задание. Подробности см. во внутреннем исключении. ---> Newtonsoft. Json .JsonSerializationException: невозможно найти конструктор для использования для типа Microsoft.Extensions.FileProviders.PhysicalFileProvider. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, помеченный атрибутом JsonConstructor. Path 'Providers [0] .Source.FileProvider. Root ', строка 1, позиция 490. "

Мой файл запуска (раздел Hangfire):

 private void ConfigureHangfire(IServiceCollection services)
        {
            var settings = Configuration.GetSettings<HangfireSettings>();

            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UsePostgreSqlStorage(Configuration.GetConnectionString("service_user"), new PostgreSqlStorageOptions
                {
                    SchemaName = "hangfire",
                    QueuePollInterval = TimeSpan.FromSeconds(15),
                    UseNativeDatabaseTransactions = true,
                    PrepareSchemaIfNecessary = true,
                    TransactionSynchronisationTimeout = TimeSpan.FromMinutes(15)
                });

            var options = new PostgreSqlStorageOptions
            {
                PrepareSchemaIfNecessary = settings.CreateDatabaseAutomatically
            };

            services.AddHangfire(config => config.UsePostgreSqlStorage(Configuration.GetConnectionString("service_user"), options));

            DailyDatabaseUpdate.TurnOnDailyUpdateScheduleWorker(9, 51, Configuration);
        }

После теста я понял, что мой метод DailyDatabaseUpdate.TurnOnDailyUpdateScheduleWorker (9, 51, Конфигурация); содержит параметр Конфигурация IConfiguration . Когда я его убрал, все работает. Но это взаимодействие имеет решающее значение для получения моей строки подключения.

Как ее можно решить?

1 Ответ

1 голос
/ 20 марта 2020

Хорошее решение состоит в том, чтобы настроить строку соединения как IOption или нечто подобное, например привязать конфигурацию к какому-либо объекту, а затем добавить этот объект в конструктор, который содержит метод, выполняющий роль повторяющегося задания.

Пример:

public StatusJobs(DbOptions dbOptions)
{
    _dbOptions= dbOptions
}

[DisableConcurrentExecution(timeoutInSeconds: 20)]
[AutomaticRetry(Attempts = 0, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
public void DoSmth()
{
    //dbOptions avalaible here
}

Кроме того, было бы лучше ввести некоторую фабрику соединений вместо коннектостроки.

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