ack方法只适用于第一个螺栓,不适用于其他螺栓

f45qwnt8  于 2021-06-21  发布在  Storm
关注(0)|答案(2)|浏览(253)

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

spout 1 -> bolt A -> bolt B -> bolt C -> bolt D

如果某个条件在螺栓a中不满足,我们现在称之为:

collector.ack(tuple);

它将调用 ack 喷口中的方法。
如果某个条件不满足,则在螺栓b中,我们称其为:

collector.ack(tuple);

但它不叫 ack 喷口中的方法。但过了一段时间 fail 方法?
我不知道为什么?第一级螺栓 ack 工作,但不适用于其他螺栓。

d7v8vwbk

d7v8vwbk1#

除非你使用 BaseBasicBolt ,它不会自动确认。一般来说,您应该避免使用父类,因为确认和失败实际上是您自己想要做的事情。
根据你删除的评论,看起来你没有“锚定”元组。这是这里发生的一个重要因素。锚定元组连接到它前面的元组树节点。所以当在bolt b中没有锚定时,实际上是在发送一个元组,而与传入的数据没有任何连接。
如果你可以忍受丢失数据,那么千万不要锚定元组。对于低值数据,甚至可能更可取,但如果需要确保数据将被处理,则必须对其进行锚定 emit(tuple, new Values(...) 否则,storm无法知道何时必须重播失败或超时的消息。
小贴士:当你 fail 元组,也称为 collector.reportError 导致它失败的例外。是的,你应该积极捕捉螺栓中的错误。

klsxnrf1

klsxnrf12#

你的问题不是很清楚,但我猜你基本上没有抓住每一个螺栓执行。规则很简单-执行的每个bolt都必须确认输入元组。否则,将不确认喷口并发生超时(因此将调用fail方法)。

相关问题