我想知道何时调用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),但答案似乎没有指出任何设计原则或规范。
答案 0 :(得分:8)
当客户端代码在TopologyBuilder实例上调用IComponent.declareOutputFields(...)
时,在客户端计算机上调用方法createTopology()
。请查看TopologyBuilder.java中在Spout或Bolt组件上调用此方法的第226行。
回调方法IComponent.declareOutputFields(...)
是拓扑生命周期的一部分,而不是Spout或Bolt生命周期的一部分。要回答您的问题,请在open()
方法之前调用此方法。
输出字段应在declareOutputFields()
方法中声明,以便Storm序列化Spout / Bolt对象,包括配置和输出字段。然后将Spout / Bolt的序列化实例提交给Storm集群,之后调用Spout / Bolt的其他生命周期方法(activate()
,open()
等)。