2013-05-15 49 views
1

我們使用SQL Server 2008 R2來處理郵件隊列。新郵件進入隊列,然後每分鐘一次批處理文件讀取未處理的郵件,進行一些處理,通過smtp發送郵件並在發送隊列中標記郵件(記錄不會從隊列中刪除,因爲表也用作郵件歷史記錄表)。SQL觸發批處理文件

這種方法的問題是,它僅運行一分鐘一次這樣的郵件不是「自動」發出去了,批處理文件運行,每分鐘,即使有好幾個小時沒有傳出郵件。

是否有SQL服務器的方式來運行插入到郵件隊列上的每個新項目的批處理文件?我知道有觸發器,但從我明白他們是異步的,所以如果批處理文件需要時間,它會阻止SQL服務器

+3

爲什麼與外部批處理文件費心呢?您可以直接在SQL Server內部輕鬆實現此功能 - 也可以更輕鬆地進行管理。另外:您可以創建一個每工作x分鐘就會運行一次的SQL作業,並檢查是否需要做任何事情 - 這樣,它就與數據庫的「正常」操作分離開來,並且不會干擾用戶輸入數據 –

+0

發送電子郵件需要在外部運行,因爲在發送之前會執行一些非相關的處理。每隔幾分鐘檢查一次隊列的過程的缺點是,如果不需要,它會運行很多次,另一方面看起來沒有響應,因爲電子郵件將在幾分鐘後而不是立即發生。 – user1480192

+0

你目前的解決方案看起來很好。我不明白你對郵件沒有被「自動」發送的評論,因爲事實上他們是。如果您需要立即發送消息,那麼電子郵件是錯誤的機制,因爲它不是爲此設計的:您不知道需要交付和/或閱讀多長時間。只要有效地查詢數據庫,服務每隔幾分鐘檢查一次數據庫就沒有任何問題。 – Pondlife

回答

1

我會創建一個SQL服務器代理作業,以使用光標在作業中運行批處理文件如果有多個行一次更新。在運行代理作業的表上創建一個觸發器。這不會阻塞SQL服務器,因爲它是通過SQL代理運行的。行將被處理,並立即發送電子郵件。

0

你說的是從SQL Server發送電子郵件?

http://msdn.microsoft.com/en-us/library/office/aa155737(v=office.10).aspx

如果是這樣,只是納入送入你的程序。

如果不是這樣,假設你有IIS,不要試圖做自己的隊列。創建一個將電子郵件添加到.NET隊列(如批處理服務器)的CLR過程。然後,您可以在批處理服務器上運行一個用於讀取隊列併發送電子郵件的進程。不要定期運行它 - 只要將它保持在一個阻塞讀取隊列併發送郵件的循環中即可。 (您可能必須將其添加到啓動/定期運行或彈性和災難恢復原因)。