我想知道何时调用Storm Spout的各种方法。
我看过ISpout
javadoc,这给了我以下心理模型:
"instantiated" -- open(...) -----> "activated"
"activated" -- deactivate() --> "deactivated"
"deactivated" -- activate() ----> "activated"
"activated" -- close() -------> "shutdown"
"deactivated" -- close() -------> "shutdown"
但是我不确定何时调用
IComponent.declareOutputFields(...)
。在open(...)
之前还是之后?什么时候需要声明输出流和字段?在declareOutputFields(...)
内?还是可以保留对OutputFieldsDeclarer
的引用并在以后定义它们?如果是这样,它可以在单独的线程上吗?我发现了这个相关的问题(Testing Storm Bolts and Spouts),但是答案似乎并不指向任何设计原则或规范。
最佳答案
当客户端代码在TopologyBuilder实例上调用IComponent.declareOutputFields(...)
时,将在客户端计算机上调用方法createTopology()
。请查看TopologyBuilder.java中的第226行,在Spout或Bolt组件上调用此方法。
回调方法IComponent.declareOutputFields(...)
是拓扑生命周期的一部分,而不是Spout或Bolt生命周期的一部分。为了回答您的问题,该方法在open()
方法之前被调用。
应该在declareOutputFields()
方法中声明输出字段,以便Storm序列化Spout / Bolt对象,包括配置和输出字段。然后将Spout / Bolt的序列化实例提交到Storm集群,然后调用Spout / Bolt的其他生命周期方法(activate()
,open()
等)。