IBasicBolt和IRichBolt之间的区别

来源:互联网 发布:移动应用测试 知乎 编辑:程序博客网 时间:2024/06/06 03:00

IRichBolt继承自IBolt,IBolt会使用OutputCollector来发送元组。

public interface IBolt extends Serializable {...  void prepare(Map stormConf, TopologyContext context, OutputCollector collector);...}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

OutputCollector有两个用于发送元组的函数:

//后续component会向acker发送ack响应。List<Integer> emit(String streamId, Tuple anchor, List<Object> tuple)//后续component不会向acker发送ack响应。List<Integer> emit(String streamId, List<Object> tuple) {
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

IBasicBolt使用BasicOutputCollector来发送元组

public interface IBasicBolt extends IComponent {...void execute(Tuple input, BasicOutputCollector collector);...}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

BasicOutputCollector只有第二个emit函数。但是这个函数包裹了OutputCollector第一个emit函数来完成工作。

//out是一个OutputCollector实例.List<Integer> emit(String streamId, List<Object> tuple) {        return out.emit(streamId, inputTuple, tuple);    }
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

因此,在IBasicBolt中,emit(String streamId, List<Object> tuple)是用于处理元组的可靠方法。但是,在IRichBolt中,它不是一个可靠的方法。

在使用IRichBolt是,如果你想可靠的处理元组,你应该显式地调用emit(String streamId, Tuple anchor, List<Object> tuple) 。

0 0