我想知道风暴喷口上的各种方法何时调用。
我看过 ISpout
javadoc,这给了我以下的心理模型:
"instantiated" -- open(...) -----> "activated"
"activated" -- deactivate() --> "deactivated"
"deactivated" -- activate() ----> "activated"
"activated" -- close() -------> "shutdown"
"deactivated" -- close() -------> "shutdown"
但我不确定什么时候 IComponent.declareOutputFields(...)
被称为。之前还是之后 open(...)
? 何时需要声明输出流和字段?内 declareOutputFields(...)
? 或者可以保留对 OutputFieldsDeclarer
以后再定义?如果是的话,它能在一个单独的线程上吗?
我发现了这个相关的问题(测试风暴螺栓和喷口),但答案似乎没有指向任何设计原则或规范。
1条答案
按热度按时间sczxawaw1#
方法
IComponent.declareOutputFields(...)
在客户端代码调用时在客户端计算机上调用createTopology()
在topologybuilder示例上。请查看topologybuilder.java中的第226行,在该行中,这个方法在spout或bolt组件上被调用。回调方法
IComponent.declareOutputFields(...)
是拓扑生命周期的一部分,而不是喷口或螺栓生命周期的一部分。为了回答您的问题,在open()
方法。输出字段应该在
declareOutputFields()
方法,以便storm序列化喷口/螺栓对象,包括配置和输出字段。然后将spout/bolt的序列化示例提交给storm集群,然后提交其他生命周期方法(activate()
,open()
等)称为。