Quartz.Net: каждый раз, когда выполняется задание, использование памяти увеличивается.C#

Место общения программистов C#
Ответить
Anonymous
 Quartz.Net: каждый раз, когда выполняется задание, использование памяти увеличивается.

Сообщение Anonymous »

Я пытаюсь запланировать работу с помощью Quartz.Net. Я создал простой проект API, инициализировал в нем Quartz и подключил Quartz к базе данных PostgreSQL для хранения заданий и триггеров. Пока все хорошо. Я могу создавать и удалять новые задания, при их выполнении также нет проблем.
Однако во время работы программы потребление памяти продолжает увеличиваться. После некоторого времени работы, в зависимости от количества заданий, программа выдает исключение OutOfMemoryException и аварийно завершает работу.
С помощью инструмента мониторинга Rider я вижу, что она создает службы или классы и не может избавьтесь от них, следовательно, использование памяти увеличивается. Я пытался просмотреть документацию Quartz.Net и различные другие сообщения/вопросы, но не смог найти решения.
Мой проект API представляет собой базовый проект API .NET. Единственными изменениями являются приведенные ниже конфигурации.
Использованные пакеты Nuget: Конфигурации в appsettings.json приведены ниже:

Код: Выделить всё

"ConnectionStrings": {
"DefaultConnection": "User ID=postgres;Password=postgres;Server=localhost;Port=5432;Database=postgre_db"
},
"Quartz": {
"quartz.scheduler.instanceName": "default",
"quartz.jobStore.type": "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
"quartz.jobStore.driverDelegateType": "Quartz.Impl.AdoJobStore.PostgreSQLDelegate, Quartz",
"quartz.jobStore.tablePrefix": "QRTZ_",
"quartz.jobStore.dataSource": "default",
"quartz.dataSource.default.connectionStringName": "DefaultConnection",
"quartz.dataSource.default.provider": "Npgsql",
"quartz.jobStore.useProperties": "true",
"quartz.serializer.type": "newtonsoft"
}
Вот как я выполнил настройки в Program.cs:

Код: Выделить всё

// Read configurations in appsettings.json
builder.Services.Configure(builder.Configuration.GetSection("Quartz"));

// Use Quartz
builder.Services.AddQuartz(configurator =>
{
configurator.UsePersistentStore(options =>
{
options.UsePostgres(builder.Configuration.GetConnectionString("DefaultConnection")!);
options.UseNewtonsoftJsonSerializer();
});

// Create a job and trigger
JobKey jobFromProgram = new("JobFromProgram");
configurator.AddJob(jobFromProgram);
configurator.AddTrigger(trigger => trigger.ForJob(jobFromProgram)
.WithIdentity("JobFromProgramTrigger")
.WithCronSchedule("*/5 * * ? * *")); // Run every 5 seconds

});

builder.Services.AddQuartzHostedService(options =>
{
options.WaitForJobsToComplete = true;
});
А это мой класс Job.

Код: Выделить всё

public class SimpleJob(ILogger logger) : IJob
{
public Task Execute(IJobExecutionContext context)
{
logger.LogInformation($"{context.JobDetail.Key.Name} executed! {DateTime.Now}");
return Task.CompletedTask;
}
}
Когда программа запускается с такой настройкой, триггеры считываются из базы данных и выполняются задания. В этой настройке есть одно задание, и оно выполняется каждые 2 секунды. Однако каждый раз, когда задание выполняется, использование памяти увеличивается без какого-либо уменьшения времени, пока не произойдет сбой программы.
Я также пытался создать собственный класс JobFactory и пытался использовать это:

Код: Выделить всё

public class SimpleJobFactory(IServiceProvider serviceProvider) : IJobFactory
{
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)serviceProvider.GetRequiredService(bundle.JobDetail.JobType);
}

public void ReturnJob(IJob job) { }
}

// In Program.cs, in the AddQuartz section I used it like this:
configurator.UseJobFactory();
Я также пытался зарегистрировать классы job-jobfactory и IScheduler как одиночный элемент:

Код: Выделить всё

builder.Services.AddSingleton().AddSingleton();
builder.Services.AddSingleton(provider => provider.GetRequiredService().GetScheduler().GetAwaiter().GetResult());
но и эти попытки не сработали. И на данный момент я не могу понять, в чем дело


Подробнее здесь: https://stackoverflow.com/questions/793 ... -increases
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»