我想知道何时调用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()等)。

08-26 01:45