Однако во время работы программы потребление памяти продолжает увеличиваться. После некоторого времени работы, в зависимости от количества заданий, программа выдает исключение OutOfMemoryException и аварийно завершает работу.
С помощью инструмента мониторинга Rider я вижу, что она создает службы или классы и не может избавьтесь от них, следовательно, использование памяти увеличивается. Я пытался просмотреть документацию Quartz.Net и различные другие сообщения/вопросы, но не смог найти решения.
Мой проект API представляет собой базовый проект API .NET. Единственными изменениями являются приведенные ниже конфигурации.
Использованные пакеты Nuget:
Код: Выделить всё
Код: Выделить всё
"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"
}
Код: Выделить всё
// 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;
});
Код: Выделить всё
public class SimpleJob(ILogger logger) : IJob
{
public Task Execute(IJobExecutionContext context)
{
logger.LogInformation($"{context.JobDetail.Key.Name} executed! {DateTime.Now}");
return Task.CompletedTask;
}
}
Я также пытался создать собственный класс 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();
Код: Выделить всё
builder.Services.AddSingleton().AddSingleton();
builder.Services.AddSingleton(provider => provider.GetRequiredService().GetScheduler().GetAwaiter().GetResult());
Подробнее здесь: https://stackoverflow.com/questions/793 ... -increases
Мобильная версия