2012-02-20 142 views
0

如果您曾經去過短信消息站點,您可能已經看到用戶可以決定他們希望在以後安排發送他們的短消息。 因此,用戶登錄該網站(現實生活中的示例是http://www.smslive247.com或​​),組成短信並單擊「稍後發送消息」無線電框。這爲用戶提供了一個日期時間字段,然後您可以選擇要發送消息的日期和時間(以及更改時區的能力)。 基本上,用戶可以安排發送短信。稍後發送消息

我也在設計一個類似的網站,並想知道是否有人能告訴我這是如何完成的。

謝謝。

回答

1

使用消息隊列(例如在數據庫中),該消息隊列由單獨的進程(例如服務或cron作業)讀取,該進程處理記錄併發送消息。

+0

謝謝,我已經看到很多有關cron工作的話題,但是我一直無法控制任何一個指向正確方向的人。然而,談論寫作服務......聽起來很有趣。你能給我一個鏈接,我可以得到如何做到這一點的教程? – Abimbola 2012-02-20 15:17:48

+0

@Abimbola [cron](http://clickmojo.com/code/cron-tutorial.html),[windows服務](http://msdn.microsoft.com/en-us/library/zt39148a.aspx)。 – CodeCaster 2012-02-20 15:23:56

+0

好吧,我相信很多像我這樣的新手程序員都會遇到挑戰......克服它們的能力讓我們變得更好。 – Abimbola 2012-02-20 15:26:36

0

一種方法是存儲消息並編寫服務來發送排隊的消息。您可以將消息存儲在數據庫中。

+0

謝謝Tundey,我可以得到一個參考,可以指出我在正確的方向。謝謝 – Abimbola 2012-02-20 15:18:52

0

一種方法是使用數據庫。

使用包含消息應該發送的日期時間的列和包含消息的另一列創建表。

從後臺線程(或者甚至另一個進程,如Windows服務或SQL代理任務)中,每隔一段時間喚醒一次,讀取表中的第一行,並查看是否該執行它。例如:

CREATE TABLE MyQueue (
    TimeToExec DATETIME NOT NULL, 
    Message NVARCHAR(MAX) NOT NULL 
) 

INSERT INTO MyQueue VALUES(GETDATE(), N'message') 

;WITH MYCTE AS (
    SELECT TOP 1 Message 
    FROM MyQueue 
    WITH (ROWLOCK, READPAST) 
     WHERE TimeToExec <= GETDATE() 
     ORDER BY TimeToExec 
) DELETE FROM MYCTE 
    OUTPUT DELETED.Message 
+0

謝謝RickNZ,好主意。但是,在共享主機的網站上,您可能無法使用sql代理(特別是在php中的mysql數據庫中)。我試過我的個人數據庫上的SQL代理,它的工作原理。雖然,我還沒有看到ASP.net的windows服務,但我正在考慮在PHP/MySql引擎和ASP.net上解決這個問題。 – Abimbola 2012-02-20 16:39:35

+0

該代碼的作用是什麼?爲什麼不簡單地使用包含ID的'Messages'表(因此您不會刪除具有相同消息併發送時間的消息,例如計劃在2012年12月31日發送的200個「新年快樂!」消息:59,而你只發送一個),一個SendDateTime列和一個SentDateTime列。然後,您的服務只需選擇消息'Where SentDateTime爲null,SendDateTime <= Now()',併發送它們。然後它更新成功發送的設置SentDateTime,它通過ID進行設置。 – CodeCaster 2012-02-20 17:51:45

+0

你可以在你的應用中使用上面的代碼;它不一定在SQL代理中。例如,您可以啓動後臺工作線程。 @CodeCaster:代碼發現下一條應該發送的消息,將其從隊列中刪除,並在單個事務中將消息返回給調用者。代碼僅僅是爲了廣泛地展示如何完成它 - 當然,如果合適的話,您可以包含ID和/或SentTime列(或者將消息寫入另一個表以用於存檔目的)。 – RickNZ 2012-02-21 06:19:44