1

ストリーミング 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]
    }
}

基本的な機能は次のとおりです。

  1. ユーザーが Web サイトからフェッチャーを開始します。
  2. fetcher が新しいツイートを受け取り、DB に保存します
  3. fetcher は、ユーザーが停止するまでツイートを受信し続けます。

アプリケーションには、フェッチャーとタスクを制御するダッシュボードがあり、ユーザーはフェッチャーのダウンロード中にダッシュボードを操作できる必要があります。

私の質問は、フェッチャーはアプリをブロックしますか、それとも別のスレッドで実行されますか? 最悪の場合、これを解決するには何を変更する必要がありますか? 私はまだ使えるアプリにはほど遠いので、テストすることはできません。それでも、できれば今のうちに直したい。

4

2 に答える 2