簡體   English   中英

在Quartz.NET中調度具有高CPU負載的作業

[英]Scheduling jobs with high CPU load in Quartz.NET

我正在使用Quartz.NET來安排一個從外部源加載大量數據並在數據庫中持久化的作業。 下載后,必須對它們進行一些處理,這將在數據庫的不同表中創建其他記錄。

下載工作是一項有狀態的工作,每分鍾運行一次。 我遇到的問題是,在下載數據后,處理部分的處理時間可能比我預期的要長得多。

我應該怎么做呢? 我在創建另一份工作(僅運行一次)時,數據下載完成了。 在這種情況下,下載程序作業可以在每分鍾運行(這是原始計划),因為下載部分僅需要5-20秒,而另一個作業可以在下載程序完成后處理這些記錄。 處理器作業將從數據庫中獲取標記為未處理的記錄,並對其進行處理。

這是處理處理的正確方法嗎? 我的另一個想法是設置一個WCF服務,它將處理一個下載的元素。 這將在每個下載的元素上調用。 但是,我認為這不會比其他工作方法表現更好。

也許更好的方法應該是將作業用作事件,並讓另一個服務執行下載。

該作業只是向另一個端點發送定義意圖的消息。

這在具有某種消息代理或服務總線的事件驅動架構中非常常見,例如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.");
    }
}

您可以考慮為下載作業設置JobListener 只需創建一個實現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);注冊監聽器scheduler.AddJobListener(myJobListener); ,讓監聽器在作業成功執行后進行處理。

讓下載作業安排另一個作業進行處理的方法是可行的並且通常使用。

但要記住的一件事是,只要下載作業不總是安排處理作業,這就有效。 如果您的下載作業始終安排作業(比如說每分鍾)並且預定作業的運行時間比運行時間長,那么最終將耗盡處理線程,並且您的下載作業必須等待線程可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM