package storm.cookbook.tfidf.spout;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
import twitter4j.FilterQuery;
import twitter4j.StallWarning;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
public class TwitterSpout extends BaseRichSpout {
Logger LOG = LoggerFactory.getLogger(TwitterSpout.class);
LinkedBlockingQueue<Status> queue = null;
TwitterStream twitterStream;
String[] trackTerms;
long maxQueueDepth;
SpoutOutputCollector collector;
public TwitterSpout(String[] trackTerms, long maxQueueDepth) {
this.trackTerms = trackTerms;
this.maxQueueDepth = maxQueueDepth;
}
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
queue = new LinkedBlockingQueue<Status>(1000);
StatusListener listener = new StatusListener() {
public void onStatus(Status status) {
if (queue.size() < maxQueueDepth) {
LOG.trace("TWEET Received: " + status);
queue.offer(status);
} else {
LOG.error("Queue is now full, the following message is dropped: " + status);
}
}
public void onDeletionNotice(StatusDeletionNotice sdn) {
}
public void onTrackLimitationNotice(int i) {
}
public void onScrubGeo(long l, long l1) {
}
public void onException(Exception e) {
}
public synchronized void onStallWarning(StallWarning arg0) {
LOG.error("Stall warning received!");
}
};
twitterStream = new TwitterStreamFactory().getInstance();
twitterStream.addListener(listener);
FilterQuery filter = new FilterQuery();
filter.count(0);
filter.track(trackTerms);
twitterStream.filter(filter);
}
public void nextTuple() {
Status ret = queue.poll();
if (ret == null) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
} else {
collector.emit(new Values(ret));
}
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("tweet"));
}
}