我有一個存儲過程發送一封電子郵件到20k,我從一個.NET網頁向它傳遞參數來調用它。這需要一些時間來發送,如果頁面關閉發送停止。在瀏覽器關閉後繼續執行存儲過程
我想將參數傳遞給過程,讓它運行直到完成。
是否最好的方法來創建一個SSIS包並從網頁開始呢?如果是這樣,我可以將參數傳遞給包並關閉瀏覽器嗎?
我有一個存儲過程發送一封電子郵件到20k,我從一個.NET網頁向它傳遞參數來調用它。這需要一些時間來發送,如果頁面關閉發送停止。在瀏覽器關閉後繼續執行存儲過程
我想將參數傳遞給過程,讓它運行直到完成。
是否最好的方法來創建一個SSIS包並從網頁開始呢?如果是這樣,我可以將參數傳遞給包並關閉瀏覽器嗎?
我想調用一個SSIS包仍然是同步的。你需要解耦它們並讓它們異步運行。
這看起來很適合Windows服務。您的網頁可以設置一個標誌來驅動服務的控制邏輯。
否則,只需設置一個Sql代理作業,用於輪詢數據庫的給定時間間隔,並在設置標誌時開始發送電子郵件。當然,從網頁上設置標誌。這將使它們分離。
通過創建一個具有SSIS執行步驟並使用sp_start_job的SqlAgent作業,可以異步啓動存儲過程的SSIS作業。 SSIS: Execute Package via Stored Procedure更詳細地介紹了此選項。如果你走這條路線,我不會試圖將參數直接傳遞給作業(我知道這樣做的唯一方法就是動態創建作業)。相反,我只需將一些值插入到數據庫隊列表中,並擁有一個處理該隊列的包。
您可能還對某些允許在asp.net中運行後臺任務的框架感興趣(如Hangfire)。
Quartz.NET是另一種流行的後臺作業框架。
斯科特Hanselman的覆蓋幾個這些選項在How to Run Background Tasks in asp.net(而且一定要注意在Asp.net後臺任務可能會失敗的方式,例如由於應用程序池回收)
但是,無論你採取什麼辦法,您不應該認爲作業已成功完成 - 換句話說,您需要維護某種傳出的電子郵件隊列,以便在發生故障時重試。
謝謝你的採訪。如果我使用代理作業,我會如何將網頁上收集的參數傳遞給過程?我可以在網頁上發佈這項工作嗎? –
不要將作業連接到網頁上。網頁應該只在數據庫中設置一個標誌(布爾字段),表示有電子郵件發送,下一次作業運行時應檢查標誌並決定發送電子郵件並重置它。 – Kar