例如,我有一个由1个喷口和4个螺栓组成的拓扑结构
spout 1 -> bolt A -> bolt B -> bolt C -> bolt D
如果某个条件在螺栓a中不满足,我们现在称之为:
collector.ack(tuple);
它将调用 ack
喷口中的方法。
如果某个条件不满足,则在螺栓b中,我们称其为:
collector.ack(tuple);
但它不叫 ack
喷口中的方法。但过了一段时间 fail
方法?
我不知道为什么?第一级螺栓 ack
工作,但不适用于其他螺栓。
2条答案
按热度按时间d7v8vwbk1#
除非你使用
BaseBasicBolt
,它不会自动确认。一般来说,您应该避免使用父类,因为确认和失败实际上是您自己想要做的事情。根据你删除的评论,看起来你没有“锚定”元组。这是这里发生的一个重要因素。锚定元组连接到它前面的元组树节点。所以当在bolt b中没有锚定时,实际上是在发送一个元组,而与传入的数据没有任何连接。
如果你可以忍受丢失数据,那么千万不要锚定元组。对于低值数据,甚至可能更可取,但如果需要确保数据将被处理,则必须对其进行锚定
emit(tuple, new Values(...)
否则,storm无法知道何时必须重播失败或超时的消息。小贴士:当你
fail
元组,也称为collector.reportError
导致它失败的例外。是的,你应该积极捕捉螺栓中的错误。klsxnrf12#
你的问题不是很清楚,但我猜你基本上没有抓住每一个螺栓执行。规则很简单-执行的每个bolt都必须确认输入元组。否则,将不确认喷口并发生超时(因此将调用fail方法)。