首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Quartz.NET中调度高CPU负载的作业

在Quartz.NET中调度高CPU负载的作业
EN

Stack Overflow用户
提问于 2011-10-20 16:33:08
回答 3查看 2.1K关注 0票数 3

我正在使用Quartz.NET调度一个作业,该作业从外部源加载一堆数据并持久存储在数据库中。在下载它们之后,还必须对它们进行一些处理,这将在数据库中的另一个表中创建额外的记录。

downloader作业是有状态作业,每分钟都在运行。我面临的问题是,在下载数据之后,处理数据的部分可能需要比我预期的更长的时间。

我该如何管理呢?我考虑过在数据下载完成时创建另一个作业(仅运行一次)。在这种情况下,下载程序作业可以在每分钟内运行(这是最初的计划),因为下载部分只需要5-20秒,并且其他作业可以在下载程序完成后处理这些记录。processer作业将从数据库中获取标记为未处理的记录,并对其进行处理。

这是处理过程的正确方法吗?我来的另一个想法是建立一个WCF服务,它将处理一个下载的元素。这将在每个下载的元素上调用。然而,我不认为这会比其他工作方法表现得更好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-20 22:57:38

让下载作业调度另一个作业来进行处理的方法是可行的,也是常用的。

但要记住的一件事是,只要下载作业不总是调度处理作业,它就可以工作。如果下载作业总是调度作业(比方说每分钟),并且调度的作业运行的时间超过该时间,则最终将耗尽处理线程,并且下载作业将不得不等待线程可用。

票数 1
EN

Stack Overflow用户

发布于 2014-02-01 00:06:36

也许更好的方法应该是使用作业作为事件,并让另一个服务执行下载。

作业只会向另一个端点发送一条定义意图的消息。

这在具有某种消息代理或服务总线(如NServiceBus或MassTransit )的事件驱动体系结构中非常常见。

这样,您的调度程序将保持精简和可伸缩性。

下面是一个示例:

代码语言:javascript
运行
复制
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.");
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-06-19 00:21:25

您可以考虑为下载作业设置一个JobListener。只需创建一个实现IJobListener接口的类,然后将处理代码放在JobWasExecuted方法中:

代码语言:javascript
运行
复制
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);注册监听程序,并在作业成功执行后让监听程序进行处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7833128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档