package storm.wordcount;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;publicclassSentenceSpoutextendsBaseRichSpout{private SpoutOutputCollector collector;private String[] sentences ={"The logic for a realtime application is packaged into a Storm topology","The stream is the core abstraction in Storm","A spout is a source of streams in a topology","All processing in topologies is done in bolts","for each bolt which streams it should receive as input","every spout tuple will be fully processed by the topology","Each spout or bolt executes as many tasks across the cluster","Topologies execute across one or more worker processes"};privateint index =0;@Overridepublicvoidopen(Map conf, TopologyContext context, SpoutOutputCollector collector){// TODO Auto-generated method stub//当集群初始化该水龙头之后,调用该方法this.collector = collector;}@OverridepublicvoidnextTuple(){//每次调用该方法,就从数据源读取一个句子,然后发射出去//发送当前元组// this.collector.emit(tuple);//发射指定的元组,同时给该元组设置一个消息ID,当该元组在下个bolt中处理失败,则该spout重发// this.collector.emit(tuple, messageId);// 可以指定使用哪个流来发射该元组,streamId就是在declareOutputFields声明的流名称// this.collector.emit(streamId, tuple);// this.collector.emit(streamId, tuple, messageId);//将当前元祖发送给哪个任务,可以通过taskId来指定,直接分组// this.collector.emitDirect(taskId, tuple);//还可以保证消息处理的完整性 messageId// this.collector.emitDirect(taskId, tuple, messageId);//指定流来发送当前元组,直接分组策略// this.collector.emitDirect(taskId, streamId, tuple);//可以保证消息完整性 messageId// this.collector.emitDirect(taskId, streamId, tuple, messageId);this.collector.emit(newValues(sentences[index % sentences.length]));
index++;try{// 模拟流的均匀流进来
Thread.sleep(10);}catch(InterruptedException e){
e.printStackTrace();}}@OverridepublicvoiddeclareOutputFields(OutputFieldsDeclarer declarer){//声明一个流,使用的是默认流Default,声明元组的结构// declarer.declare(fields);// 声明一个流,可以声明为直接流,同时声明元组的结构,使用的是默认的流default// declarer.declare(direct, fields);//声明一个流,可以设置流的名称,声明元组的结构// declarer.declareStream(streamId, fields);// 声明一个流,可以声明为直接流,同时声明元组的结构,还可以设置流的名称// declarer.declareStream(streamId, direct, fields);// 声明元组的结构,字段名称为sentence,下个闪电bolt可以通过该名称获取元组的内容
declarer.declare(newFields("sentence"));}}