2010-11-24 59 views
1

我需要在我的Web服務器來執行一些活動/工作,如索引的一些信息,組織一些文件,並計算一些統計數據...實現作業調度的ASP.NET MVC

我想在我的Web服務器中保留QoS(性能,內存消耗......)。所以我在考慮執行這些活動的外部進程,而不是調用一個線程。類似於Apache MPM processer(它啓動子進程來處理請求)。

  • 要知道任何最好的解決方案嗎?
  • 你知道任何圖書館可以爲我做這個嗎?

謝謝先進。

回答

1

好了,我終於實現了一個系統中的外部進程來執行任務/作業。

如果有人想知道我是如何實現它的,下面是一些細節。也許我會寫一篇文章來分享解決方案和源代碼。

基本上,我們有兩個組件,所述Web.dll(ASP.NET應用程序)和被叫TaskExecutor.exe

Web.dll程序,有一個活動調度器,它可以通過名稱註冊任務:例如:

ActivityScheduler.Get().RegisterActivity("GenerateSearchIndexes", 4 * 1000 * 60 * 60); //each 2 hours 

活性調度在一個線程執行每個活動,並且該線程調用一個外部進程中,ActivityExecutor.exe

該組件具有與一個參考Web.dll有一個靜態的ActivityFactory來獲取活動。外部程序的源代碼很簡單:

public static void Main (string[] args) 
{ 
    try 
    { 
     if (args.Length == 0) 
     { 
      throw new ArgumentException("No activity name given", "ActivityName"); 
     } 
     //parameter 0 is the activity name 
     string activityName = args[0]; 
     IScheduledActivity activity = ActivityFactory.GetActivity(activityName); 

     if (activityName != null) 
     { 
      activity.Execute(args); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Error executing activity: " + ex.Message); 
    } 
} 

正如你可以在這裏猜測的限制是活動必須是靜態定義,所以他們不能在其構造函數接收paramenters。通過IScheduledActivity.Schedule(string[] args)方法傳遞,就像程序做的一樣。

1

您可以看看Quartz.NET,它允許您安排將在服務器上運行的作業。

+0

我正在閱讀文檔... Quartz可以在單獨的進程中執行作業嗎? – 2010-11-24 08:22:40

+0

@Daniel,Quartz執行作業,那些作業可以產生進程:`Process.Start(「foo.exe」);`。 – 2010-11-24 08:25:49