2011-12-01 43 views
3

我創造了「隊列管理器」服務,其唯一的工作職責是對工作項目從隊列添加到隊列和刪除工作項。我已經將該服務作爲單例實現,因爲我需要處理一些獨特的同步問題。每當需要新任務時,我都會創建一個新的Task對象,設置參數,然後將其發送給QueueManager服務並將其添加到SQL數據庫中。當時Task對象被序列化到數據庫。當一個進程從QueueManager請求一個項目時,該服務找到下一個可用的工作項目並將其反序列化回Task對象 - 從那裏它返回給客戶端。構建隊列服務 - 序列化任務供以後使用

從技術上講,這個偉大的工程。但是,我不喜歡不得不將任何類型的任務都放到Task對象中。工作項目的範圍可以從複製文件到更新數據庫。我必須向Task對象添加很多屬性,這對許多其他任務類型來說並不意味着什麼 - 它變得相當sl。。我首先想到如何解決這個問題,將Task作爲基類實現,然後讓所有其他任務從Task派生。這將允許我有CopyFileTask,UpdateDatabaseTask,DoLaundryTask等工作項。然後,我會將該對象序列化到數據庫,並添加一個列來告訴我該類型是什麼,以便我知道如何在稍後反序列化它。

我看到這樣做的第一個問題這樣將是WCF服務需要返回只有一個類型。這需要服務將工作項目(例如CopyFileTask)下傳到任務。但是,我現在需要將其轉換回它的真實類型,但客戶端將不知道該類型是什麼。

我可能沒有做好解釋這一點。概括地說,我需要:

  • 創建任何類型的工作對象
  • 它傳遞給WCF服務以存儲在一個數據庫
  • 調用WCF服務來獲得一個新的工作項目(任何它認定)
  • 有工作項目重新調整到客戶端作爲一個真正的(非鑄造) 對象

我的隊列必須是非常通用的,因爲許多其他應用程序添加和刪除工作項。這是爲大規模並行系統而設計的,它將成爲所有分佈式工作項目的中心。任何和所有的幫助和想法將會大受歡迎。

感謝,

斯科特

+0

一些想法 - 你可以創建一個ITask接口嗎?或者,Task對象是否可以有一個實現ISerializable的成員變量「Details」? –

回答

0

這實際上是使用NoSQL數據庫一樣CouchDB完美的場景。如果您必須存儲未綁定到硬模式但基於更多文檔(或者您的情況)基於任務的數據,則此類數據庫會受到影響。你用一種類型使它們變得不可靠,但底層結構不受約束。

CouchDB是一個選項嗎?然後結帳relax - CouchDB的.NET API。

如果沒有,只是像存儲類型的基本數據,創建,...(基本數據,你需要設置一個查詢來獲取在隊列中的下一個任務)中單獨列在您的SQL任務表。然後你有一個名爲細節或工作項的列,它將任務的詳細信息保存爲XML。