storm组件初始化问题及与spring的结合方式

来源:互联网 发布:阿里云 挂载数据盘 编辑:程序博客网 时间:2024/05/21 08:47
一般来说spout/bolt的生命周期如下: 
1.在提交了一个topology之后(是在nimbus所在的机器么?), 创建spout/bolt实例(spout/bolt在storm中统称为component)并进行序列化. 
2.将序列化的component发送给所有的任务所在的机器 ,序列化是对实体对象序列化而不是类,所以在这之前component一定是实例化完成,而component中的初始化数据最好在prepare中完成,而不要在component,如果在component中初始化数据因为同样会被序列化,容易出错。
3.在每一个任务上反序列化component. 
4.在开始执行任务之前, 先执行component的初始化方法(bolt是prepare, spout是open). 

因此component的初始化操作应该在prepare/open方法中进行, 而不是在实例化component的时候进行. 


将storm与spring结合

要在每个spout/bolt维护自己的ApplicationConext, 于是将一个all in one 的spring打散成spring-spout.xml, spring-bolt-xxx.xml. 然后在open/prepare方法中加载对应的spring配置文件. 


在通过main函数提交topo之前,将storm相关的配置信息通过yaml文件对应类传入到bolt中,在某一个数据库连接池的公共类中同样需要相关的配置信息,因为业务和测试需求的便捷性,便将相关配置也放入了yaml中。起初是在main函数里面进行该公共类的初始化,即将相关的config信息传入,在单bolt的情况下测试没有问题,便发布到服务器并配置多个bolt,由此就引发了一个空指针的异常。
后来在了解了storm 中bolt/spout的生命周期后,才理解了为什么会出现空指针。

0 0
原创粉丝点击