package org.tomdz.storm.esper.example; 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.utils.Utils; import twitter4j.Status; import twitter4j.StatusDeletionNotice; import twitter4j.StatusListener; import twitter4j.TwitterStream; import twitter4j.TwitterStreamFactory; import twitter4j.conf.Configuration; import twitter4j.conf.ConfigurationBuilder; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import static backtype.storm.utils.Utils.tuple; public class TwitterSpout extends BaseRichSpout implements StatusListener { private static final long serialVersionUID = 1L; private final String username; private final String pwd; private transient BlockingQueue<Status> queue; private transient SpoutOutputCollector collector; private transient TwitterStream twitterStream; public TwitterSpout(String username, String pwd) { this.username = username; this.pwd = pwd; } @Override public void ack(Object arg0) { } @Override public void fail(Object arg0) { } @Override public void open(@SuppressWarnings("rawtypes") Map conf, TopologyContext context, SpoutOutputCollector collector) { this.queue = new ArrayBlockingQueue<Status>(1000); this.collector = collector; Configuration twitterConf = new ConfigurationBuilder().setUser(username).setPassword(pwd).build(); TwitterStreamFactory fact = new TwitterStreamFactory(twitterConf); twitterStream = fact.getInstance(); twitterStream.addListener(this); twitterStream.sample(); } @Override public void onException(Exception ex) { } @Override public void onStatus(Status status) { queue.offer(status); } @Override public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { } @Override public void onTrackLimitationNotice(int numberOfLimitedStatuses) { } @Override public void onScrubGeo(long userId, long upToStatusId) { } @Override public void close() { twitterStream.shutdown(); } @Override public void nextTuple() { Status value = queue.poll(); if (value == null) { Utils.sleep(50); } else { collector.emit(tuple(value.getCreatedAt().getTime(), value.getRetweetCount())); } } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("createdAt", "retweetCount")); } }