2011-05-12 63 views
0

我遇到以下問題。
我們的客戶有一個由多個用戶使用的應用程序。現在他們想要通知超過30天未激活的用戶。如何在Web應用程序中正確設置計劃任務

我使用Spring.Quartz來解決這個問題。但現在,這些東西在Windows服務(與網站的數據庫通信)中運行。
我想知道是否無法在Web應用程序中使用Quartz庫。
只要應用程序處於活動狀態,我知道此方法有效,但如果應用程序回收,該怎麼辦?或者在一段時間內無效(例如2天)。

編輯:定期不活動是可能的。但通知應該仍然有效。

是否有其他方法可以做到這一點? 歡迎任何幫助。

乾杯

+1

保持Windows服務非常理想。你爲什麼要把這種功能放到網絡應用程序中?他們應該處理用戶請求,而不是運行週期性任務。 – jlafay 2011-05-12 12:40:25

+0

這可能很容易,但這是不好的做法。由於它們在功能上有所不同,因此將網站和服務放在不同的域中很好。 – jlafay 2011-05-12 12:54:45

回答

1

Windows服務方法在這種情況下是最好的。你也可以創建一個Windows Schedule,它會調用你的頁面(例如http:// [your-site]/[yourapp] /notifyusers.aspx),這將會做必要的事情。或者,如果您期望應用程序經常被訪問(因此您確定它不僅僅是可回收的),請將global_asax的Application_Start放置在QueueWorkingItem的啓動線程中,該線程將具有以下類似內容:

private void MyPingThread(object state) 
{ 
    ThreadExitState lstate = state as ThreadExitState; 
    EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset); 
    while (true) 
    { 
     if (lstate != null) 
     { 
      if (!lstate.Active) 
       return; 
     } 
     handle.WaitOne(1000 * 60 * 60 * 4); // Run the task each 4 hours 
     //Do your work here 
    } 
} 
0

線程應用程序啓動時(可以使用在Global.asax)剛剛踢。把它裹在一段時間(真的)和一次嘗試/趕上,確保即使發生錯誤(即在try/catch塊之外),你也有一些很好的長睡眠,並且你很好走。如果您需要即時通知,可能不太合適,但它應該適用於您正在做的事情。

+1

這將不起作用,因爲APP域將至少在29小時內回收,如果在此之後沒有活動發生,則應用程序將停止運行。當然,如果應用程序每天至少訪問幾次,這種方法將起作用。 – 2011-05-12 12:27:14

0

我通常會創建一個新的'類庫'項目並將其添加到我的解決方案中。
然後,我在任務計劃程序中創建一個新任務。

我從不將預定的工作與網站混合在一起。如果預定作業無響應,則可能會減慢甚至導致您的網站崩潰。

相關問題