2010-04-27 16 views
0

要求的存儲結果:接口設計問題:事務

  • 輸入的多個源(社交媒體內容)到系統
  • 輸出的多個目的地(社交媒體API的)
  • 源和目的地WILL加入

一些僞:

IContentProvider contentProvider = context.getBean("contentProvider"); 
List<Content> toPost = contentProvider.getContent(); 

for (Content c : toPost) { 
    SocialMediaPresence smPresence = socialMediaService.getSMPresenceBySomeId(c.getDestId()); 
    smPresence.hasTwitter(); smPresence.hasFacebook(); //just to show what this is 
    smPresence.postContent(c); //post content could fail for some SM platforms, but shoulnd't be lost forever 
} 

因此,現在我用盡了所有內容,我需要知道哪些內容已成功發佈,並且如果它沒有完全覆蓋所有平臺,或者未來添加了另一個平臺,那麼內容需要發佈(因此,我的內容提供商不僅需要知道內容是否已經發布,而且還需要了解哪些平臺)。我不在尋找代碼,雖然sample/pseudo很好......我正在尋找一種解決這個問題的方法,我可以實現

+0

能否請你解釋一下關於未來的平臺好一點的一部分嗎?假設我已經在Twitter上發佈了46576條消息。您是否希望在我將其添加到我的帳戶的那一刻,所有這些信息都會在GBuzz上傳播?或者你的意思是你從加入GBuzz之後的第一條消息*開始向GBuzz發送一份拷貝? – 2010-04-27 13:27:35

+0

我希望所有5454635即可發佈您添加帳戶:)不會發生的那一刻,因爲我會阻止它,並可能有一些例外這樣的情況,但是從概念上你可以認爲它像 – walnutmon 2010-04-27 13:41:35

回答

2

我會做這樣的事情:

將消息(以其「原始」形式)存儲在與其作者相關聯的表或其他持久性結構中,並且具有時間戳(每個消息的創建日期/時間)。

創建關聯作者/發佈渠道。

創建一個(或可能更多)「未發送消息」的隊列。此隊列的基本結構是:

| channelId | MessageId | Status | Last Attempt Timestamp 

因此,假如我Pamar,和我訂閱到Twitter,GBuzz和LinkedIn,當我在您的系統「後」這是我獲得的主要信息表中的條目,並新的消息獲取ID = 7686956 讓我們假設該消息是在13時05分06秒的20100428

創建已經創造了它,共有3條記錄在隊列中添加後:

| channelId | MessageId | Status | Last Attempt Timestamp 
    | LinkedIn | 7686956 | New | 20100428 13:05:06 
    | Twitter | 7686956 | New | 20100428 13:05:06 
    | Gbuzz  | 7686956 | New | 20100428 13:05:06 

(注意,而我寫的「LinkedIn」我希望有一個記錄ID沒有字符串)

現在,您將有一個進程從該隊列獲取記錄(或者可能是每個通道的一個或多個進程,您選擇如何擴展這個進程)訪問隊列,可能按照最老的嘗試最新 - 這個「工作者」線程嘗試在外部通道上發佈,更新最後一次嘗試時間戳,並設置狀態(OK,失敗)。 另一名工人可以在後臺刪除「OK」記錄。

現在,當你添加「臉譜」我的頻道列表中會發生什麼?

簡單,這種操作將有一個時間戳,太 - 你添加Facebook通道,我的用戶的時刻。從上週

| channelId | MessageId | Status | Last Attempt Timestamp 
    | Facebook | 7685963 | New | 20100429 11:12:08 
    | Facebook | 7680064 | New | 20100429 11:12:08 
    | Facebook | 7697046 | New | 20100429 11:12:08 

當你爲新頻道「注入」這些信息,你可以決定的規則,例如,只有消息:您訪問的消息表和轉儲這個時間戳在隊列之前創建的所有消息,所以「節制」是隱含的。

添加一個全新的渠道,需要在結構上增加了幾個記錄,並開發一個工人或策略類連接到新的渠道和使用相關的登錄配置文件和正確的API後出現。

+0

很大,這是我需要一個漂亮的解決方案,因爲我也不是不知道他們要問我以後的事,這讓我編寫一個腳本,以便在必要時進行更改 – walnutmon 2010-04-27 14:51:07

0

爲了保持它的靈活性 - 例如添加新目標 - 而不是將平臺(twitter,facebook)整合到函數名稱中,使其更通用。

smPresence.hasPlatform("facebook"); 

並迭代它所有的服務。在地圖上保留髮布成功標誌,例如按服務編制索引。

這是你在找什麼?

+0

即一個不好的決定。 – Bozho 2010-04-27 13:16:22

+0

他在這裏有兩個想法,你認爲哪一個是一個糟糕的決定?爲什麼? – walnutmon 2010-04-27 13:21:41

+0

有該信息(排序)的硬編碼字符串 – Bozho 2010-04-27 13:25:37

3
  1. 我認爲沒有什麼可以讓Content知道它將被分派到哪裏。這個邏輯應該是外部的。
  2. 添加多個平臺應該用Strategy pattern之類的東西來完成。如果你需要添加一個新的,你將不得不創建一個新的實現,並修改選擇目標的服務來添加邏輯。
  3. 您可以使用依賴注入或單例而不是使用new運算符。 (我非常贊成的DI)

所以,像這樣:

class Content { 
    String content; // or whatever type you store it in 
    ContentSource source; // who's the source of the content 
    // other relevant properties 
} 


interface SocialMedia { 
    boolean post(Content content); 
    boolean isContentSuitable(Content content); 
} 

class Facebook implements SocialMedia { 
    boolean post(Content content) { 
     // implement posting, return "true" if successful, "false" otherwise 
    } 

    boolean isContentSuitable(Content content) { 
    // decide whether this socialmedia is suitable for this content 
    // based on its source, its length or other features 
    } 
} 

class Twitter implements SocialMedia { .. similar to facebook } 


class ContentDestinationService { 
    List<SocialMedia> getContentDestinations(Content content) { 
     List<SocialMedia> result = new ArrayList<SocialMedia>(); 
     SocialMedia facebook = new Facebook(); 
     if (facebook.isContentSuitable(content)) { 
      result.add(facebook); 
     } 
     // etc for others 
     return result; 
    } 
} 

然後:

for (Content content : toPost) { 
    List<SocialMedia> destinations = 
      contentDestinationService.getContentDestinations(content); 

    int successfulPosts = 0; 
    for (SocialMedia sm : destinations) { 
     boolean success = sm.post(content); 
     // do something with this result, for example: 
     if (success) { 
      successfulPosts++; 
     } 
    } 
}