ストリーミング API からツイートをダウンロードして Web ページに表示する単純な Spring MVC アプリケーションを開発しています。アプリケーションのユーザーは、Task
ダウンロードしたいツイートのキーワードとともに を送信できます。このタスクは共有されるため、全員がタスクを開始、停止、変更、変更、またはキャンセルできます。
TwitterFetcher
ツイートのダウンロードを担当するクラスです。このクラスは Task を受け取り、データベースにダウンロードされたすべてのツイートを永続化します。
@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]
}
}
基本的な機能は次のとおりです。
- ユーザーが Web サイトからフェッチャーを開始します。
- fetcher が新しいツイートを受け取り、DB に保存します
- fetcher は、ユーザーが停止するまでツイートを受信し続けます。
アプリケーションには、フェッチャーとタスクを制御するダッシュボードがあり、ユーザーはフェッチャーのダウンロード中にダッシュボードを操作できる必要があります。
私の質問は、フェッチャーはアプリをブロックしますか、それとも別のスレッドで実行されますか? 最悪の場合、これを解決するには何を変更する必要がありますか? 私はまだ使えるアプリにはほど遠いので、テストすることはできません。それでも、できれば今のうちに直したい。