我正在使用Apache Storm,我想知道是否可以用这样的另一个螺栓组成螺栓:
public class MyNewBolt extends BaseRichBolt {
private MyOldBolt bolt; // MyOldBolt also extends BaseRichBolt
public MyNewBolt(MyOldBolt bolt) {
this.bolt = bolt;
}
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
bolt.prepare(map, topologyContext, outputCollector);
//Prepare other stuff
}
@Override
public void execute(Tuple tuple) {
bolt.execute(tuple);
bolt.someOtherMethod();
//Do some other stuff
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
bolt.declareOutputFields(outputFieldsDeclarer);
}
}
在此之后我会提交螺栓:
public static void main(String[] args) throws Exception {
.
.
.
TopologyBuilder builder = new TopologyBuilder();
BaseRichBolt bolt = new MyNewBolt(new MyOldBolt());
builder.setBolt("bolt-id", bolt).someGrouping(....);
.
.
.
}
当我在本地模式下运行它但它实际上是否在远程模式下工作时,这是有效的吗?在这种情况下,Storm如何处理bolt序列化 - 反序列化?现在创建了多少个任务?
答案 0 :(得分:1)
我建议你采取另一种方法(巧合的是我使用的方法)。不要将螺栓视为可重用的类,而是将bolt的业务逻辑分解为纯Java类。然后,如果您想在另一个螺栓中重用该逻辑,那么这样做会容易得多。
我还建议您将与特定流相关的所有行为(元组中的名称,类型和值的顺序等知识)分解到另一个类中。你的螺栓类的实现应该是相当小的。