我有一个拓扑结构,例如由1个喷口和4个螺栓组成
spout A -> bolt B -> bolt C -> bolt E
-> bolt D
Run Code Online (Sandbox Code Playgroud)
只有当螺栓B中的某些条件语句为真时,它才会将元组传递给螺栓C和螺栓D.
并且只有当螺栓C中的某些条件语句为真时,它才会将元组传递给螺栓E.
因此单个元组可能只到达螺栓B或(螺栓C和D).
我正在使用BaseBasicBolt,据我所知,它会在调用collector.emit后自动执行.
例如,螺栓B中的执行方法如下所示
public class boltB extends BaseBasicBolt {
public void execute(Tuple tuple, BasicOutputCollector collector) {
...some logic goes here
if (response.getCount() > 0) {
collector.emit(new Values(tuple.getString(0)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果没有调用collector.emit,我认为spout中的元组失败了,因为我从风暴ui看到几乎所有来自spout的元组都失败了.
在这种情况下,我应该在哪里调用'ack'来表示spout不要将其视为失败的元组?
小智 6
您正在做的事情对于您正在实施的逻辑是正确的.您不需要显式调用ack().使用时BaseBasicBolt,每个元组都在execute()方法之后执行BasicBoltExecutor.对于失败的元组,您应该检查异常.同时尝试查看Storm UI,了解每个喷口和螺栓发出/执行/失败的元组中的异常.