Проблема проектирования интерфейса: сохранение результата транзакций - PullRequest
0 голосов
/ 27 апреля 2010

Требования:

  • несколько источников ввода (контент социальных сетей) в систему
  • несколько выходных пунктов (API социальных сетей)
  • будут добавлены источники и пункты назначения

немного псевдо:

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 - это хорошо ... Я ищу подход к этой проблеме, который я могу реализовать

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010
  1. Я не думаю, что хорошо, когда Content знает, куда его отправят. Эта логика должна быть внешней по отношению к ней.
  2. Добавление нескольких платформ должно быть выполнено с помощью шаблона Strategy . Если вам нужно добавить новую, вам нужно будет создать новую реализацию SocialMedia и изменить службу, которая выбирает места назначения для добавления логики.
  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++;
       }
    }
}
2 голосов
/ 27 апреля 2010

Я бы сделал что-то вроде этого:

Храните сообщения (в их «сыром» виде) в таблице или другой персистентной структуре, связанной с их автором и имеющей метку времени (дата / время создания для каждого сообщения).

Создание ассоциации автора / канала публикации.

Создание одной (или, возможно, более) очередей "неотправленных сообщений". Базовая структура этой очереди:

   | 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", я ожидаю, что там будет идентификатор записи, а не строка)

Теперь у вас будет один процесс, получающий записи из этой очереди (или, может быть, один или несколько процессов для каждого канала, на ваш выбор, как вы хотите масштабировать это), получающий доступ к очереди, возможно, отсортированный от самой старой попытки до самой новой - этого "рабочего msgstr "Поток пытается опубликовать сообщение на внешнем канале, обновляет отметку времени последней попытки и устанавливает статус (OK, Failed). Другой работник может удалить «ОК» записи в фоновом режиме.

Теперь, что происходит, когда вы добавляете «Facebook» в мой список каналов?

Легко, эта операция также будет иметь временную метку - в тот момент, когда вы добавите канал 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 голосов
/ 27 апреля 2010

Для обеспечения гибкости - например, для добавления новых назначений - вместо включения платформы (twitter, facebook) в имена функций, сделайте ее более общей.

smPresence.hasPlatform("facebook");

И переберите все сервисы, которые у него есть. Сохраняйте флаги успешного размещения на карте, скажем, проиндексированные сервисом.

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...