C# 在Quartz.NET中调度高CPU负载的作业
我正在使用Quartz.NET计划一个作业,该作业从外部源加载一组数据并保存在数据库中。在下载它们之后,还必须对它们进行一些处理,这将在数据库的不同表中创建其他记录 downloader作业是一个有状态作业,每分钟都在运行。我面临的问题是,在下载数据后,处理部分可能需要比我预期的更长的时间 我应该如何处理这个问题?我考虑过在数据下载完成后再创建一个作业(只运行一次)。在这种情况下,downloader作业可以每分钟运行一次(这是原始计划),因为下载部分只需5-20秒,而另一个作业可以在downloader作业完成后处理这些记录。processer作业将从数据库中获取标记为未处理的记录,并对其进行处理C# 在Quartz.NET中调度高CPU负载的作业,c#,wcf,c#-4.0,scheduling,quartz.net,C#,Wcf,C# 4.0,Scheduling,Quartz.net,我正在使用Quartz.NET计划一个作业,该作业从外部源加载一组数据并保存在数据库中。在下载它们之后,还必须对它们进行一些处理,这将在数据库的不同表中创建其他记录 downloader作业是一个有状态作业,每分钟都在运行。我面临的问题是,在下载数据后,处理部分可能需要比我预期的更长的时间 我应该如何处理这个问题?我考虑过在数据下载完成后再创建一个作业(只运行一次)。在这种情况下,downloader作业可以每分钟运行一次(这是原始计划),因为下载部分只需5-20秒,而另一个作业可以在downl
这是处理处理处理过程的正确方法吗?我的另一个想法是建立一个WCF服务,它将处理一个下载的元素。这将在每个下载的元素上调用。但是,我不认为这比其他作业方法的性能更好。您让下载作业计划另一个作业来进行处理的方法是可行的,并且常用
但需要记住的一点是,只要下载作业不总是安排处理作业,这种方法就可以工作。如果您的下载作业总是安排一个作业(例如每分钟一次),并且安排的作业运行时间长于此时间,则最终会耗尽处理线程,并且您的下载作业将不得不等待线程可用。您可能会考虑为下载作业设置一个线程。只需创建一个实现
IJobListener
接口的类,然后将处理代码放入JobWasExecuted
方法:
public PostDownloadJobListener : IJobListener
{
string Name { get { return "MyJobListener"; } }
void JobToBeExecuted(JobExecutionContext context) { }
void JobExecutionVetoed(JobExecutionContext context) { }
void JobWasExecuted(JobExecutionContext context, JobExecutionException jobException)
{
// Perform processing here
}
}
使用
scheduler.AddJobListener(myJobListener)注册侦听器代码>,并让侦听器在作业成功执行后进行处理。也许更好的方法应该是将作业用作事件,并让另一个服务执行下载
作业将只向另一个端点发送定义意图的消息
这在具有某种消息代理或服务总线(如NServiceBus或MassTransit)的事件驱动体系结构中非常常见
这样,您的调度程序将保持精简和可扩展
以下是一个例子:
public class DownloadFileJob : IJob
{
public IBus Bus { get; set; }
public ILogger Logger{ get; set; }
public void Execute(IJobExecutionContext context)
{
Bus.Send(new DownloadFileMessage());
Logger.Info("Sending message requesting download of file.");
}
}
处理部分
是CPU限制的操作还是它也涉及大量IO操作?在高负载下,我指的是CPU负载,因此进程中没有大量IO。好的,那么,您是否可以尝试使用TPL并行处理,并查看您是否获得了任何好处,以便在可接受的时间内完成此操作?您的意思是在Quartz.NET作业中使用TPL,该作业也负责下载?我会试试速度有多快,但为了不耽误下一次下载,我想停留在1分钟的时间范围内。嗯,我还没有考虑你提到的可能问题。有什么“推荐”的策略或方法可以防止这种情况吗?您可以在不同的计划程序上运行长时间运行的作业,可能有足够的容量,这样您就不会耗尽线程。谢谢。如果我将downloader作业的优先级设置为high,而将处理的优先级设置为low,那就解决不了问题了?如果你建议在不同的调度程序上运行它们,我想不会,但值得一问。优先级仅用于在两个触发器需要同时触发时断开连接,因此这并不能解决问题。Quartz.net根据触发器的下一次触发时间按顺序运行作业。