核心
Spout中方法的说明
1、Spout数据源
消息源Spout是storm的Topology中的消息生产者。
2、spout介绍
2、1spout的结构
Spout是storm的核心组件之一,最源头的接口是IComponent
2、2Spout发出的消息
Spout从外部获取数据后,向Topology中发出的Tuple可以是可靠的,也可以是不可靠的。
注意:一个可靠的消息源可以重新发射一个Tuple(如果该Tuple没有被storm成功处理),但是一个不可靠的消息源spout一旦发出,一个Tuple就把它彻底”遗忘”,也就不可能再发了。
2、3Spout发射的流
Spout可以发射多个流,要达到这样的效果,使用OutputFieldsDeclarer.declareStream来定义多个流(即定义多个stream),然后使用SpoutOutputCollector来发射指定的流。
2、4Spout的重要方法
Spout的重要方法是nextTuple,nextTuple方法发射一个新的元组到Topology,如果没有新的元组发射,则直接返回。注意任务Spout的nextTuple方法都不要实现成阻塞的,因为storm是在相同的线程中调用spout的方法。Spout的另外两个重要方法是ack和fail方法,当spout发射的元组被拓扑成功处理时,调用ack方法,当处理失败时,调用fail方法,ack和fail方法仅被可靠的spout调用。
2、5Spout的组件
Spout的最顶层抽象是ISpout接口,在通常情况下,实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余的代码,可以直接继承BaseRichSpout
3、Spout 实例
3、1open方法
当 一个task被初始化时会调用open方法,一般都会在此方法中初始化发送tuple的对象SpoutOutputCollector和配置对象TopologyContext.
代码如下
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector=collector;
}
3、2declareOutputFields
此方法用于声明当前Spout的Tuple发送流。流的定义是通过OutputFieldsDeclare.declareStream方法完成的,其中的参数包括了发送的域Fields
代码如下
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("sentence"));
}
3、3nextTuple方法
这是Spout类中最重要的一个方法,发射一个Tuple到Topology都是通过该方法来实现的。
代码如下
public void nextTuple() {
String sentence=msgs[random.nextInt(8)];
collector.emit(new Values(sentence));
}
另外,除了上述的几个方法之外,还有getComponentConfiguration、ack、fail和close方法等,getComponentConfiguration方法用于配置当前组件的参数,storm监测到一个tuple被成功处理时调用ack方法,处理失败时调用fail方法,这两个方法在BaseRichSpout类中已经被隐式实现了