我正在尝试创建一个cron作业,它应该获取登录用户的tweet。
我试着这样做:
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);
}
}但是它当然不能工作,因为twitter连接存在于请求作用域中(我该如何配置这个作业?
发布于 2013-11-25 09:01:19
登录的用户与web会话相关联,因此在应用程序的web级别获取请求范围的Twitter对象是没有问题的。
但是,计划的/cron作业独立于应用程序的web层运行。它们没有“登录用户”的概念,因为它们仅仅是后台bean,类似于服务或DAO,因为它们没有当前用户是谁的概念。从MessagesSaver的角度来看,谁是已登录的用户?很容易就会有很多登录的用户。它被期望代表哪一个工作?
您可以将UsersConnectionRepository注入到MessagesSaver中,使用它来获取特定用户的ConnectionRepository,然后使用它来获取Twitter连接(并由此获得Twitter API绑定)。棘手的一点是(再一次)谁是登录的用户?可能有MessagesSaver应该使用的many...which one?
抛开你在这里写的东西,你想要实现什么?也许还有另一种方法可以做你需要的事情。
https://stackoverflow.com/questions/20174317
复制相似问题