package storm.cookbook.tfidf.spout;
import java.util.Map;
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 redis.clients.jedis.Jedis;
import storm.cookbook.tfidf.Conf;
public class TweetURLSpout extends BaseRichSpout {
private Jedis jedis;
private String host;
private int port;
private SpoutOutputCollector collector;
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("url"));
}
public void open(Map conf, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
host = conf.get(Conf.REDIS_HOST_KEY).toString();
port = Integer.valueOf(conf.get(Conf.REDIS_PORT_KEY).toString());
this.collector = spoutOutputCollector;
connectToRedis();
}
private void connectToRedis() {
jedis = new Jedis(host, port);
}
public void nextTuple() {
String url = jedis.rpop("url");
if (url == null) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
} else {
collector.emit(new Values(url));
}
}
}