package com.packtpub.twitter;
import storm.trident.operation.TridentCollector;
import storm.trident.spout.ITridentSpout.Emitter;
import storm.trident.topology.TransactionAttempt;
import twitter4j.*;
import twitter4j.conf.ConfigurationBuilder;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class TweetEmitter implements Emitter<Long>, Serializable {
private static final long serialVersionUID = 1L;
public static AtomicInteger successfulTransactions = new AtomicInteger(0);
public static AtomicInteger uids = new AtomicInteger(0);
public static String SEARCH_PHRASE = "apple jobs";
private QueryResult result = null;
private Twitter twitter = null;
private Query query = null;
private long lastFetch = -1;
private static final long FETCH_PERIODICITY = 15 * 1000; // 15 seconds.
public TweetEmitter() {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true).setOAuthConsumerKey("DJSv02qbCiCVY6Sy8uz8Cg")
.setOAuthConsumerSecret("iVa3GGSl9NrHvu3AAXm6zBV7Z2XTvtuDkAMiArHlGM")
.setOAuthAccessToken("1353264175-5EWRtEHoaJ6zfmAG5BEn7Uc7E8qg7P531oddm08")
.setOAuthAccessTokenSecret("ss7YCprReDBEpm4AGnguqB1xNCUwyRGli5Q33yImf0");
TwitterFactory tf = new TwitterFactory(cb.build());
twitter = tf.getInstance();
query = new Query(SEARCH_PHRASE);
query.setLang("en");
long now = System.currentTimeMillis();
if (now - lastFetch > FETCH_PERIODICITY) {
try {
result = twitter.search(query);
} catch (TwitterException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void emitBatch(TransactionAttempt tx, Long coordinatorMeta, TridentCollector collector) {
for (Status status : result.getTweets()) {
List<Object> tweets = new ArrayList<Object>();
tweets.add(SEARCH_PHRASE);
tweets.add(status.getText());
collector.emit(tweets);
System.out.println("Emitted [" + status.getText() + "]");
}
}
@Override
public void success(TransactionAttempt tx) {
successfulTransactions.incrementAndGet();
}
@Override
public void close() {
}
}