package storm.starter.spout; import twitter4j.FilterQuery; import twitter4j.StallWarning; import twitter4j.Status; import twitter4j.StatusDeletionNotice; import twitter4j.StatusListener; import twitter4j.TwitterStream; import twitter4j.TwitterStreamFactory; import twitter4j.conf.ConfigurationBuilder; import backtype.storm.Config; import twitter4j.conf.ConfigurationBuilder; 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 backtype.storm.utils.Utils; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; public class NewTwitterSpout extends BaseRichSpout { public static final String MESSAGE = "message"; SpoutOutputCollector _collector; LinkedBlockingQueue<Status> queue = null; TwitterStream _twitterStream; // String _username; // String _pwd; // public TwitterSampleSpout(String username, String pwd) { // _username = username; // _pwd = pwd; // } @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { queue = new LinkedBlockingQueue<Status>(1000); _collector = collector; ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) .setOAuthConsumerKey("6SHXy7aiX2ZnUZiF4ZD1zg") .setOAuthConsumerSecret("W2Rryb92Z94uq8GDyZdQqGW2HTCBuC7WFuDtyPGdHw") .setOAuthAccessToken("101576455-bzS8xHra4lxvAIfTpuPkEFmYLvDUTmiL7tnxY1KI") .setOAuthAccessTokenSecret("J5nXSvuD2Qbc3prOYEQQfPlVFymBuwU49yj1KzLxjok04"); TwitterStreamFactory tf = new TwitterStreamFactory(cb.build()); _twitterStream = tf.getInstance(); StatusListener listener = new StatusListener() { @Override public void onStatus(Status status) { System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText()); } @Override public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId()); } @Override public void onTrackLimitationNotice(int numberOfLimitedStatuses) { System.out.println("Got track limitation notice:" + numberOfLimitedStatuses); } @Override public void onScrubGeo(long userId, long upToStatusId) { System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId); } @Override public void onStallWarning(StallWarning warning) { System.out.println("Got stall warning:" + warning); } @Override public void onException(Exception ex) { ex.printStackTrace(); } }; _twitterStream.addListener(listener); FilterQuery tweetFilterQuery = new FilterQuery(); // See tweetFilterQuery.track(new String[]{"Bieber", "Teletubbies"}); // OR on keywords tweetFilterQuery.locations(new double[][]{new double[]{-126.562500,30.448674}, new double[]{-61.171875,44.087585 }}); // See https://dev.twitter.com/docs/streaming-apis/parameters#locations for proper location doc. //Note that not all tweets have location metadata set. tweetFilterQuery.language(new String[]{"en"}); // Note that language does not work properly on Norwegian tweets _twitterStream.filter(tweetFilterQuery); _twitterStream.sample(); } @Override public void nextTuple() { Status ret = queue.poll(); if(ret==null) { Utils.sleep(50); } else { _collector.emit(new Values(ret)); } } @Override public void close() { _twitterStream.shutdown(); } @Override public Map<String, Object> getComponentConfiguration() { Config ret = new Config(); ret.setMaxTaskParallelism(1); return ret; } @Override public void ack(Object id) { } @Override public void fail(Object id) { } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("tweet")); } }