我有一个拓扑结构,例如由1个喷口和4个螺栓组成
spout 1 -> bolt A -> bolt B -> bolt C -> bolt D
如果某些条件不满意,请参阅Bolt A,我们现在称之为:
collector.ack(tuple);
它将在Spout中调用ack
方法。
如果某些条件不满意,请参考Bolt B中的相同内容:
collector.ack(tuple);
但它不会在Spout中调用ack
方法。相反,一段时间后它会调用fail
方法?
我不知道为什么?对于第一级螺栓ack
有效,但不适用于其他螺栓。
答案 0 :(得分:0)
你的问题不是很清楚,但我猜你基本上没有找到执行过的每个螺栓。规则很简单 - 每个执行的螺栓必须确认输入元组。否则,spout不会被激活并发生超时(因此调用fail方法)。
答案 1 :(得分:0)
除非您使用BaseBasicBolt
,否则它不会自动确认。作为一般规则,你应该避免使用那个父类,因为你自己想做的事情就是找到和失败。
根据您删除的评论,您似乎没有“锚定”您的元组。这是发生在这里的重要因素。锚定的元组连接到它之前的元组树节点。因此,当你在Bolt B中没有锚定时,发生了什么事实上你实际上发送了一个元组而没有任何与进来的数据相关的信息。
如果你可以忍受失去数据,那么一定不要锚定元组。对于低价值数据,它甚至可能更可取,但如果您需要确保数据将被处理,则必须将其锚定emit(tuple, new Values(...)
否则风暴无法知道何时必须重播消息失败或超时。
提示:当你fail
一个元组时,也会在导致它失败的异常上调用collector.reportError
。是的,你应该积极地捕捉螺栓中的错误。