我们需要在创建拓扑时传递一个对象,以便bolt可以访问该对象并根据该对象进行进一步处理。是否可以通过TopplogyContext
传递对象,如果是,如何传递?或者在提交拓扑之前是否还有其他方法可以传递对象,然后提交,以便bolt可以对其进行句柄/控制?
我们需要通过上下文传递对象,以便所有螺栓都可以访问它,并且不需要在该拓扑的所有螺栓中强制构造函数的实现。那么,想知道是否存在任何API来做同样的事情?
答案 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对象访问它