Storm正常的参数构造应该放在prepare方法中,但是如果你放在了bolt的构造函数的中,则会出现问题,参数得不到正常的初始化,原因如下:
Bolt是Storm中的基础运行单位,当接收到一条数据时可以不立刻对其进行处理,可以先保存后处理。其生命周期如下:
- 创建提交Topology时创建IBolt实例并进行序列化操作(见createTopology());
- 将序列化的Bolt组件发送给集群中的主节点;
- 主节点启动工作进程,并在进程中反序列化Bolt组件;
- 在开始执行任务之前,先调用Bolt的prepare()回调方法进行初始化,然后再具体处理接收的数据。 IBolt的具体代码如下:
public interface IBolt extends Serializable{
void prepare(Map stormConf, TopologyContext context, OutputCollector collector);
void execute(Tuple input);
void cleanup();
}
在实现Bolt的过程中,用户可以编写其构造函数,然而构造函数并不会被实际调用,因为在提交Topology时,系统会调用Topology的构造函数,并将产生的对象序列化成字节数组。每一个节点上的Bolt都是通过反序列化的方式得到的,这可能导致某些成员没有被正确的初始化,因此用户应该将复杂对象的初始化放在prepare()回调方法中。