// WAIT UNTIL AVAILABLE
tweetSearch.waitUntilAvailable(10000);
ElasticUserSearch userSearch = injector.getInstance(ElasticUserSearch.class);
ElasticTagSearch tagSearch = injector.getInstance(ElasticTagSearch.class);
Configuration cfg = injector.getInstance(Configuration.class);
// 1. every producer has a separate queue (with a different capacity) to feed TweetConsumer:
// TProd1 -- queue1 --\
// TProd2 -- queue2 ---> TweetConsumer
// ...
// 2. TweetConsumer polls N elements from every queue and feeds the results
// into the resolver - see GenericUrlResolver.
// 4. Via ElasticTweetSearch:s commit listener the URL:s of tweets will be
// resolved -
// For every URL an article is created and feeded into the article index
TweetConsumer twConsumer = injector.getInstance(TweetConsumer.class);
twConsumer.setUncaughtExceptionHandler(excHandler);
GenericUrlResolver resolver = injector.getInstance(GenericUrlResolver.class);
resolver.start();
int queueCapacity = cfg.getUrlResolverInputQueueSize();
// feeding consumer via twitter search (or offline fake)
TweetProducer twProducer = injector.getInstance(TweetProducer.class);
twProducer.setTwitterSearch(tws);
twProducer.setUserSearch(userSearch);
twProducer.setTagSearch(tagSearch);
twProducer.setQueue(twConsumer.register("producer-search", queueCapacity, 100));
// feeding consumer via twitter keyword stream (gets keywords from tagindex)
TweetProducerViaStream producerViaStream = injector.getInstance(TweetProducerViaStream.class);
producerViaStream.setQueue(twConsumer.register("producer-stream", queueCapacity, 120));
producerViaStream.setTwitterSearch(tws);
producerViaStream.setTagSearch(tagSearch);
producerViaStream.setUncaughtExceptionHandler(excHandler);
producerViaStream.setTweetsPerSecLimit(cfg.getTweetsPerSecLimit());
// feeding consumer from tweets of friends (of registered users)
TweetProducerViaUsers producerFromFriends = injector.getInstance(TweetProducerViaUsers.class);
producerFromFriends.setQueue(twConsumer.register("producer-friends", queueCapacity, 100));
producerFromFriends.setTwitterSearch(tws);
producerFromFriends.setUserSearch(userSearch);
producerFromFriends.setUncaughtExceptionHandler(excHandler);
// feeding consumer from UI
RMIServer rmiServer = injector.getInstance(RMIServer.class);
rmiServer.setQueue(twConsumer.register("producer-rmi", queueCapacity, 20));
Thread rmiServerThread = rmiServer.createThread();
// configure tweet index to call UrlResolver after feeding of a tweet
tweetSearch.setRemoveOlderThanDays(cfg.getTweetSearchRemoveDays());
tweetSearch.setBatchSize(cfg.getTweetSearchBatch());
Thread twProducerThread = new Thread(twProducer, "tweet-producer");
twProducerThread.setUncaughtExceptionHandler(excHandler);
twProducerThread.start();
rmiServerThread.start();
twConsumer.start();
producerFromFriends.start();
if (cfg.isStreamEnabled())
producerViaStream.start();
// ## JOIN
twProducerThread.join();
if (cfg.isStreamEnabled())
producerViaStream.interrupt();
producerFromFriends.interrupt();
twConsumer.interrupt();
rmiServerThread.interrupt();