我的拓扑代码示例如下:
builder.setSpout("spout", new KafkaSpout);
builder.setBolt("bolt1", new Bolt1).shuffleGrouping("spout");
builder.setBolt("bolt2", new Bolt2).shuffleGrouping("bolt1");
builder.setBolt("bolt3", new Bolt3).shuffleGrouping("bolt2");
发出bolt1时,该消息将自动确认。但是,当bolt2或bolt3发生异常时,此消息将无法重新发送,如何检索失败的消息?
答案 0 :(得分:0)
风暴具有tuple trees
的概念。让我尝试使用问题中提供的示例进行解释。
当您的spout
调用collector.emit
方法时,新发出的元组(我们称为tuple1
)被添加到tuple tree
中。该元组已订阅bolt1
,到达spout
,并将接收从tuple1
发出的数据。一旦它在execute
方法中接收到tuple2
作为输入,在处理了输入之后,将发出一个新值tuple1
,该新值将被添加到execute
之后的元组树中。在退出collector.ack
方法之前,通过隐式调用tuple1
来确认元组,这会告诉风暴tuple2
已被处理,请从元组树中将其删除,然后保留bolt2
传递给bolt1
进行处理。
现在出现了一个问题,如果$("body").on("click", "#btnEdit", function (e) {
TransactionId = $(this).closest("div").find('#SearchItemID').text();
EditorDuplicate(TransactionId);
});
$("body").on("click", "#btnDuplicate", function (e) {
TransactionId = $(this).closest("div").find('#SearchItemID').text();
EditorDuplicate(TransactionId);
GetnextItemCode();
})
由于某种原因无法确认会发生什么。 Storm将看到在一段时间(即拓扑超时时间)(默认为30s)之后,元组树还没有耗尽,因此它将从头开始重播元组,并且将执行与上述相同的过程。