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

Apache storm 停止处理特定螺栓中的元组,apache-storm,Apache Storm,例如,我有一个由1个喷口和4个螺栓组成的拓扑 spout A -> bolt B -> bolt C -> bolt E -> bolt D 只有当螺栓B中的某个条件语句为true时,它才会将一个元组传递给螺栓C和螺栓D 只有当bolt C中的某个条件语句为true时,它才会将一个元组传递给bolt E 所以单元组可能只到达螺栓B或(螺栓C和D) 我使用的是BaseBasicBolt,据我所知,它会在调用collector.emit后

例如,我有一个由1个喷口和4个螺栓组成的拓扑

spout A -> bolt B -> bolt C -> bolt E
                  -> bolt D
只有当螺栓B中的某个条件语句为true时,它才会将一个元组传递给螺栓C和螺栓D

只有当bolt C中的某个条件语句为true时,它才会将一个元组传递给bolt 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)));
        }
    }
}
所以,如果没有调用collector.emit,我认为来自喷口的元组失败了,因为我从storm ui中看到,来自喷口的几乎所有元组都失败了


在这种情况下,我应该把喷口称为“ACK”,而不是把它看作失败的元组?< /P> < P>你所做的是正确的。您不需要显式调用

ack()
。使用
BaseBasicBolt
时,每个元组在
execute()
方法之后由
BasicBoltExecutor
确认。对于失败的元组,应该检查异常。还可以尝试查看Storm UI,查看每个喷口和螺栓发出/执行/失败元组中的异常情况。

当您有BaseBasicBolt时,即使您没有发出任何信息,也会为您完成确认

BaseCBolt实例在BasicBoltExecutor中执行,其 execute()方法如下所示:

public void execute(Tuple input) {
     _collector.setContext(input);
     try {
         _bolt.execute(input, _collector);
         _collector.getOutputter().ack(input);
     } catch(FailedException e) {
         if(e instanceof ReportedFailedException) {
             _collector.reportError(e);
         }
         _collector.getOutputter().fail(input);
     }
}
因此,为了停止处理一个元组,只要不发出,在执行调用之后,它就会被确认。由于没有更多螺栓运行,因此将调用喷口中的ack回调

希望它能回答你的问题