我需要您的建議來安排MVC3 Webapp中的任務。使用Quartz.NET的MVC3 webapp任務調度
我的任務是爲webapp中的不同服務創建一些通用調度程序,以便以後在開發中使用。例如,我們有一些用戶可以隨時安排的可用任務。
我不想重新發明輪子,並找到可用於創建調度程序的Quartz.Net庫。我知道這是不是一個好主意,主持調度內部Web應用程序原因Web服務器可以回收應用程序池等,所以我決定在Windows服務中使用它,然後使用Quartz.NET遠程處理功能來觸發我內部的任務Web應用程序。
但我發現了一些問題。糾正我,如果我錯了,但是當我試圖使用Quartz.NET遠程處理它運行Windows服務進程內的作業,這意味着它需要知道我的web應用程序內的所有類型,所以所有程序集的webapp應該引用它,我需要另一個數據庫配置文件等,所以如果我寫新的工作類,我不能輕鬆地安排它,我需要停止服務,並更新它的庫,所以這不是非常通用的方法。
我找不到Quartz.NET只能根據它的接口運行作業的任何信息。
所以我想出了一個想法,寫我自己的調度程序,它將被託管在Windows服務中,並且將有一些IJob接口將在webapp中實現。我還將使用IPC通道使用.Net遠程處理。 因此,webapp會像.Net Remoting Server一樣,當我想添加一些新的工作然後安排它時,我只需要編寫實現IJob接口的新工作。 我會在這種情況下,註冊爲
IpcChannel channel = new IpcChannel("CurrentIPC");
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(SimpleJob), "SimpleJob", WellKnownObjectMode.SingleCall);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ComplexObject), "ComplexObject", WellKnownObjectMode.SingleCall);
我將不得不註冊了兩個作業類型。然後,調度工作,當我會把Windows服務端的類和名字,將代表客戶機(在web應用端執行的對象),我將只是IJob綁定類的傳遞的名稱是這樣的:
Dictionary<string, IJob> jobs = new Dictionary<string, IJob>();
void AddJob(string name)
{
IJob obj = (IJob)Activator.GetObject(typeof(IJob), string.Format("ipc://CurrentIPC/{0}", name));
jobs.Add(name, obj);
}
所以,現在我不需要操心我的應用程序和其他的東西引用,調度會做的工作不知道什麼,只是IJob接口和web應用程序端執行的任務。
如果我錯了或它太複雜了,還有一些其他更簡單的方法來做到這一點,或者有一些我不知道的陷阱,你能幫我嗎? 謝謝。
P.S. 此外還有一個想法,有單獨的調度程序,它將通過執行指向Web應用程序中的指定服務的鏈接直接運行Web應用程序方法,例如「http:// localhost:3030/Request/12」,就這樣,但在我的網絡應用程序中,您應該被授權執行此類請求,並且我們還有問題需要解決,並且在數千個計劃任務的情況下,我們將在網絡服務器上額外加載這些請求。
如果選擇了這種方法,可能會出現另一個問題。併發 - 調用相同的作業url將觸發兩個作業執行。如果是電子郵件,您可能會最終發送兩封相同的電子郵件。 –
這是真的,如果這是一個問題,那麼可能需要一些安全措施,或者在調度程序中假定url唯一標識作業實例或可能在作業中,假設作業能夠識別類似作業正在運行或已經完成。 –