Apache Storm - 用另一个螺栓组成一个螺栓

时间:2014-06-08 20:18:37

标签: java constructor decorator composition apache-storm

我正在使用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序列化 - 反序列化?现在创建了多少个任务?

1 个答案:

答案 0 :(得分:1)

我建议你采取另一种方法(巧合的是我使用的方法)。不要将螺栓视为可重用的类,而是将bolt的业务逻辑分解为纯Java类。然后,如果您想在另一个螺栓中重用该逻辑,那么这样做会容易得多。

我还建议您将与特定流相关的所有行为(元组中的名称,类型和值的顺序等知识)分解到另一个类中。你的螺栓类的实现应该是相当小的。