如何在使用storm时将拓扑上下文中的对象访问到bolt中?

时间:2013-08-02 05:50:18

标签: apache-storm

我们需要在创建拓扑时传递一个对象,以便bolt可以访问该对象并根据该对象进行进一步处理。是否可以通过TopplogyContext传递对象,如果是,如何传递?或者在提交拓扑之前是否还有其他方法可以传递对象,然后提交,以便bolt可以对其进行句柄/控制?

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

2 个答案:

答案 0 :(得分:12)

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

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

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

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

这是你在bolt或spout的prepare()方法中检索它的方法:

prepare(Map stormConf,TopologyContext context) {

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

} 

答案 1 :(得分:3)

我不太清楚你的意思,但你的bolt类总是可以在初始化时获取一个参数,你可以在创建拓扑时用你想要传递的对象初始化它。

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

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

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