Apache storm 停止处理特定螺栓中的元组
例如,我有一个由1个喷口和4个螺栓组成的拓扑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后
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回调
希望它能回答你的问题