2013-11-24 3 views
0

Я пытаюсь создать задание cron, которое должно получать твиты пользователя в журнале.Создание задания cron для извлечения сообщений Twitter из пользовательской стены, используя spring-social

Я пытаюсь сделать это следующим образом:

public class MessagesSaver { 
private static final Logger logger = LoggerFactory 
     .getLogger(MessagesSaver.class); 
private static String TWITTER_NETWORK = "twitter"; 
private static String FACEBOOK_NETWORK = "facebook"; 
private static int MAX_TWEET_COUNT_PER_PAGE = 50; 
@Autowired 
private MessageRepository messageRepository; 
@Autowired 
private Twitter twitter; 

@Scheduled(cron = "0 30 * * * *") 
public void getMessagesFromSocialNetworks() { 
    if (twitter != null) { 
     List<Tweet> tweets = twitter.timelineOperations().getUserTimeline(
       MAX_TWEET_COUNT_PER_PAGE); 
     parseAndSaveTwitterPosts(tweets); 
    } 
} 
} 

и SocialConfig:

@Configuration 
@EnableSocial 
public class SocialConfig implements SocialConfigurer { 

    @Inject 
    private DataSource dataSource; 

    // 
    // SocialConfigurer implementation methods 
    // 

    @Override 
    public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, 
      Environment env) { 
     cfConfig.addConnectionFactory(new TwitterConnectionFactory(env 
       .getProperty("twitter.consumerKey"), env 
       .getProperty("twitter.consumerSecret"))); 
    } 

    @Override 
    public UserIdSource getUserIdSource() { 
     return new UserIdSource() { 
      @Override 
      public String getUserId() { 
       return "admin"; 
      } 
     }; 
    } 

    @Override 
    public UsersConnectionRepository getUsersConnectionRepository(
      ConnectionFactoryLocator connectionFactoryLocator) { 
     return new JdbcUsersConnectionRepository(dataSource, 
       connectionFactoryLocator, Encryptors.noOpText()); 
    } 



    @Bean 
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES) 
    public Twitter twitter(ConnectionRepository repository) { 
     Connection<Twitter> connection = repository 
       .findPrimaryConnection(Twitter.class); 
     return connection != null ? connection.getApi() : null; 
    } 

    // 
    // Web Controller and Filter Beans 
    // 
    @Bean 
    public ConnectController connectController(
      ConnectionFactoryLocator connectionFactoryLocator, 
      ConnectionRepository connectionRepository) { 
     ConnectController connectController = new ConnectController(
       connectionFactoryLocator, connectionRepository); 
     return connectController; 
    } 

    @Bean 
    public ProviderSignInController providerSignInController(
      ConnectionFactoryLocator connectionFactoryLocator, 
      UsersConnectionRepository usersConnectionRepository) { 
     return new ProviderSignInController(connectionFactoryLocator, 
       usersConnectionRepository, new SimpleSignInAdapter(
         new HttpSessionRequestCache())); 
    } 

    @Bean 
    public DisconnectController disconnectController(
      UsersConnectionRepository usersConnectionRepository, Environment env) { 
     return new DisconnectController(usersConnectionRepository, 
       env.getProperty("facebook.clientSecret")); 
    } 

    @Bean 
    public ReconnectFilter apiExceptionHandler(
      UsersConnectionRepository usersConnectionRepository, 
      UserIdSource userIdSource) { 
     return new ReconnectFilter(usersConnectionRepository, userIdSource); 
    } 

} 

Но, конечно, это не работает, потому что соединение щебет жить в рамках запроса ( Как я могу настроить это задание?

ответ

1

Зарегистрированный пользователь связан с веб-сеансом, поэтому нет проблем с получением объекта Twitter с запросом на уровне веб-сайта вашего приложения.

Однако задания по расписанию/cron работают независимо от веб-уровня вашего приложения. У них нет понятия «зарегистрированный пользователь», так как они просто фоновые компоненты, аналогичные службам или DAO, поскольку они не имеют понятия о том, кем является текущий пользователь. С точки зрения PostsSaver, кто является зарегистрированным пользователем? Там может быть легко многие вошли в систему. Какого из них ожидать от работы?

Вы можете ввести UserConnectionRepository в MessageSaver, использовать его для получения ConnectionRepository для конкретного пользователя, а затем использовать его для получения подключения Twitter (и от этого, привязки API Twitter). Трудный бит (снова), который является зарегистрированным пользователем? Может быть много ... какой из них должен использовать MessageSaver?

Отступив от того, что вы здесь написали, что вы пытаетесь достичь? Возможно, есть еще один способ сделать то, что вам нужно.

+0

Спасибо за ваш ответ) Должно быть только 1 пользователь, который войдет в твиттер. –

+0

Я пытаюсь объяснить, что я хочу делать) У меня есть 1 учетная запись Twitter и вы хотите получить новый твит этого пользователя (или получить твиты с помощью хэш-тега) по заданию и поместить его в базу данных. Это все. –

+0

, когда я пытаюсь сделать именно то, как вы говорите («Вы можете вставить UserConnectionRepository в MessageSaver, использовать его для получения ConnectionRepository для конкретного пользователя, а затем использовать его для получения соединения Twitter (и от этого, привязки API Twitter)), Я получаю исключение: Ошибка создания bean-компонента с именем 'scopedTarget.connectionRepository': Scope 'request' неактивен для текущего потока; рассмотрите возможность определения доверенного прокси для этого компонента, если вы намерены ссылаться на него из одноэлементного; –