【发布时间】:2019-05-28 13:16:28
【问题描述】:
我在我的应用程序中使用 Quartz.NET 3.0.7 来处理一些计划任务,但是当我启动计划程序时,它会在计划程序运行时增加内存。我还检查了打印一些列表的简单计划任务控制台上的字符串也发生了同样的问题。我不明白什么是实际问题。我的观察是 IJob 对象在工作完成后被释放。除此之外我不知道。
我通过传递 JobType 来动态创建工作
private IJobDetail GetJobDetailForType<TInput>(string jobKey, string jobGroup) where TInput : IJob
{
IJobDetail jobDetail = JobBuilder.Create<TInput>()
.WithIdentity(jobKey, jobGroup)
.Build();
return jobDetail;
}
并在此函数中初始化调度作业
private void InitializeSchedulerJob(ScheduleJob scheduleJob)
{
IJobDetail jobDetail;
ITrigger trigger = this.GetTrigger(scheduleJob.Code.ToString(), tenantCode, scheduleJob.CornSchedule);
if (scheduleJob.Code == (int)EnumHelper.Scheduler.Job.EmailJob)
{
this.logger.LogDebug($"EmailJob");
jobDetail = this.GetJobDetailForType<EmailJob>(scheduleJob.Code.ToString(), tenantCode);
}
this.scheduler.ScheduleJob(jobDetail, trigger);
}
电子邮件工作代码
public class EmailJob : IJob
{
private IServiceProvider serviceProvider;
public EmailJob(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public async Task Execute(IJobExecutionContext context)
{
if (this.serviceProvider != null)
{
JobKey jobKey = context.JobDetail.Key;
IEmailScheduleSendService emailScheduleSendServiceNew = this.serviceProvider.GetRequiredService<IEmailScheduleSendService>();
ILogger<EmailJob> logger = this.serviceProvider.GetRequiredService<ILogger<EmailJob>>();
logger.LogDebug($"FROM EXECUTE METHOD | {jobKey.Name} | {jobKey.Group} | START");
await emailScheduleSendServiceNew.EmailScheduleSendAsync(context);
logger.LogDebug($"FROM EXECUTE METHOD | {jobKey.Name} | {jobKey.Group} | END");
}
}
}
【问题讨论】:
-
您是否尝试过使用内存配置文件来找出导致内存消耗的原因?
-
你使用一些 DI 或 ServiceLocator 吗?
-
是的。我正在使用 .net core 内置 DI
-
请展示代码如何创建作业以及如何注入它们的依赖项。我没记错,Quartz 想在作业运行后释放它们,但 .Net Core DI 不支持。
标签: c# quartz-scheduler quartz.net