[英]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.