我正在開發一個簡單的Spring MVC應用程序,用於從流式API下載推文並將其顯示在網頁中。該應用程序的用戶可以提交他們想要下載的推文的關鍵字Task
。這些任務是共享的,因此每個人都可以啓動,停止,修改,更改或取消任務。Spring服務的後臺執行
TwitterFetcher
是負責下載推文的類。這個類接收一個任務,並持續下載到數據庫中的所有推文。
@Service
public class TwitterFetcher {
@Autowired
private OAuthService oAuthService;
@Autowired
private TweetService tweetService;
private Task task;
private TwitterStream twitterStream;
public void start(Task task) {
/* Stop previous stream */
stop();
/* Get OAuth credentials */
OAuth oAuth = oAuthService.findOneEnabled();
if (oAuth == null) {
} else {
this.task = task;
Configuration oAuthConfiguration = getOAuthConfiguration(oAuth);
twitterStream = new TwitterStreamFactory(oAuthConfiguration).getInstance();
twitterStream.addListener(new TwitterListener());
String keywords = task.getBaseKeywords() + ", " + task.getExpandedKeywords();
FilterQuery filterQuery = new FilterQuery();
filterQuery.track(keywords.split(", "));
twitterStream.filter(filterQuery);
}
}
public void stop() {
if (twitterStream != null) {
twitterStream.shutdown();
}
}
private Configuration getOAuthConfiguration(OAuth oAuth) {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(false);
cb.setJSONStoreEnabled(true);
cb.setOAuthAccessToken(oAuth.getAccessToken());
cb.setOAuthAccessTokenSecret(oAuth.getAccessTokenSecret());
cb.setOAuthConsumerKey(oAuth.getConsumerKey());
cb.setOAuthConsumerSecret(oAuth.getConsumerSecret());
return cb.build();
}
private class TwitterListener implements StatusListener {
@Override
public void onStatus(Status status) {
/* Persist new tweet */
Tweet tweet = new Tweet();
tweet.setJson(DataObjectFactory.getRawJSON(status));
tweetService.save(tweet);
}
[Omitted code]
}
}
的基本功能將成爲下一個:
- 開始於用戶從網站上提取程序。
- 收件人收到一條新的推文並將其保存在數據庫中
- 收件人持續接收推文,直到用戶停止推文爲止。
該應用程序有一個儀表板來控制fetchers和任務,並且用戶必須能夠在fetcher下載時與它交互。
我的問題是,fetcher會阻止應用程序還是會在不同的線程中執行?在最壞的情況下,我必須改變以解決這個問題?我還遠離可用的應用程序,所以我無法測試它。即便如此,如果可能的話,我現在要解決它。