使用风暴喷口,何时调用declareoutputfields()?

e5nqia27  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(353)

我想知道风暴喷口上的各种方法何时调用。
我看过 ISpout javadoc,这给了我以下的心理模型:

"instantiated" -- open(...) -----> "activated"
"activated"    -- deactivate() --> "deactivated"
"deactivated"  -- activate() ----> "activated"
"activated"    -- close() -------> "shutdown"
"deactivated"  -- close() -------> "shutdown"

但我不确定什么时候 IComponent.declareOutputFields(...) 被称为。之前还是之后 open(...) ? 何时需要声明输出流和字段?内 declareOutputFields(...) ? 或者可以保留对 OutputFieldsDeclarer 以后再定义?如果是的话,它能在一个单独的线程上吗?
我发现了这个相关的问题(测试风暴螺栓和喷口),但答案似乎没有指向任何设计原则或规范。

sczxawaw

sczxawaw1#

方法 IComponent.declareOutputFields(...) 在客户端代码调用时在客户端计算机上调用 createTopology() 在topologybuilder示例上。请查看topologybuilder.java中的第226行,在该行中,这个方法在spout或bolt组件上被调用。
回调方法 IComponent.declareOutputFields(...) 是拓扑生命周期的一部分,而不是喷口或螺栓生命周期的一部分。为了回答您的问题,在 open() 方法。
输出字段应该在 declareOutputFields() 方法,以便storm序列化喷口/螺栓对象,包括配置和输出字段。然后将spout/bolt的序列化示例提交给storm集群,然后提交其他生命周期方法( activate() , open() 等)称为。

相关问题