停止处理特定螺栓中的元组

Adr*_*Lee 5 apache-storm

我有一个拓扑结构,例如由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,了解每个喷口和螺栓发出/执行/失败的元组中的异常.