IBolt:
bolt接口类,定义了常用的几个接口,IBolt的实现类在client上被创建,然后序列化到拓扑里并被提交到集群的master上,之后nimbus会启动worker进行反序列化,调用prepare进行准备完毕之后就开始处理tuples
如果是在java里定义bolts ,建议实现IRichBolt.java接口类,IRichBolt.java同时继承了IComponent.java接口,提供了更多对拓扑进行操作的方法。
/**
* 当集群中的worker初始化一个跟当前Bolt相关的task时候被调用,此方法提供和准备bolt执行时的环境.
* @param stormConf 此bolt使用的storm配置,合并了本机和集群的配置,将会提供给topology
* @param context task的上下文,可以获取taskId,componentId,input,output等
* @param collector 用于任意时刻提交bolt里的tuples,collector是线程安全的,应当保存在Bolt里.
*/
void prepare(Map stormConf, TopologyContext context, OutputCollector collector);
/**
* 处理单个输入的tuple
* 这里面使用OutputCollector来提交tuples.
* 官方建议所有的输入tuples在处理完之后进行ack或者fail,否则storm无法判断该tuples是否被处理完毕
* 一般使用IBasicBolt,在execute方法中额外提供了outputCollector,会更加方便处理
* @param input
*/
void execute(Tuple input);
/**
* Bolt关闭的时候被调用,由于是被supervisor使用kill 9干掉的,所以并不保证cleanup会被执行
*/
void cleanup();
IComponent.java
组件接口,所有的bolt和spout都可以视作组件
/**
* 申明了当前组件的输出模式
* @param declarer 申明输出streamId,输出的field,判断一个output stream是否是direct stream
*/
void declareOutputFields(OutputFieldsDeclarer declarer);
/**
*获取组件配置.
* @return
*/
Map<String, Object> getComponentConfiguration();
IRichBolt.java
跟IBolt接口相似,只是多继承了IComponent,多了申明输出和获取配置两个接口
IBasicBolt.java
/**
* 跟IBolt.java中作用类似,只是少了OutPutCollector
*/
void prepare(Map stormConf, TopologyContext context);
/**
* 跟Ibolt.java中作用类似,多了OutPutCollector
*/
void execute(Tuple input, BasicOutputCollector collector);
void cleanup();