10

我们需要在创建拓扑时传递一个对象,以便螺栓可以访问该对象并基于该对象进行一些进一步的处理。是否可以通过对象传递对象TopplogyContext,如果可以,如何传递?或者在提交拓扑之前是否有其他方法可以传递对象,以便螺栓可以对其进行处理/控制?

我们需要通过上下文传递对象,以便所有螺栓都可以访问它,并且不需要在该拓扑的所有螺栓中强制实现构造函数。那么,想知道是否有任何 API 可以做到这一点?

4

2 回答 2

13

您可以在风暴配置映射中传递对象,前提是它是可序列化的。在拓扑中任何 spout 或 bolt 的 prepare() 方法中,您都可以检索此对象。

这是在拓扑提交时将对象放入配置图中的方式:

Config conf = new Config();
MyObject myPreciousObject = new MyObject("precious");
conf.put("my.object",myPreciousObject);

StormSubmitter.submitTopology(args[0], conf, builder.createTopology());

这是在螺栓或喷口的 prepare() 方法中检索它的方式:

prepare(Map stormConf,TopologyContext context) {

   MyObject myPreciousObject = (MyObject) stormConf.get("my.object");

} 
于 2013-08-30T22:24:34.623 回答
3

我不太确定您的意思,但是您的螺栓类始终可以在初始化时使用一个参数,并且您可以在创建拓扑时使用要传递的对象对其进行初始化。

TopologyBuilder builder = new TopologyBuilder();
builder.setSpout( "spout", new mySpout() );
builder.setBolt( "bolt", new myBolt1(myObj) ).shuffleGrouping("spout");

您的螺栓构造函数可以将此对象作为参数。

编辑:如果您希望可以访问数据而不将其显式传递给构造函数,您可以再次创建一个静态类来存储此数据并从螺栓对象访问它

于 2013-08-02T05:55:54.600 回答