package stormapplied.githubcommits.topology; 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 org.apache.commons.io.IOUtils; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import java.util.Map; /** * This spout simulates reading commits from a live stream by doing two things: * <p/> * 1) Reading a file containing commit data into a list of strings (one string per commit). * 2) When nextTuple() is called, emit a tuple for each string in the list. */ public class CommitFeedListener extends BaseRichSpout { private SpoutOutputCollector outputCollector; private List<String> commits; @Override public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declare(new Fields("commit")); } @Override public void open(Map map, TopologyContext context, SpoutOutputCollector outputCollector) { this.outputCollector = outputCollector; try { commits = IOUtils.readLines(ClassLoader.getSystemResourceAsStream("changelog.txt"), Charset.defaultCharset().name()); } catch (IOException e) { throw new RuntimeException(e); } } @Override public void nextTuple() { for (String commit : commits) { outputCollector.emit(new Values(commit)); } } }