最近有个需求,在WindowedBolt中需要对每个tuple进行ack,如果异常则进行fail,如是,我按照普通Bolt的写法,却始终实现不了上面的功能,代码如下:
List<Tuple> tupleList = inputWindow.get();
try {
if (tupleList.isEmpty()) {
return;
}
// batch save
service.saveDetails(details);
for (Tuple input : tupleList) {
//ack
collector.ack(input);
}
} catch (Exception ex) {
log.error("", ex);
// fail
for (Tuple input : tupleList) {
collector.fail(input);
}
}
通过测试发现每一个tuplewindow只会ack一次,具体的说就是,比如一个window窗口有100条数据,按照上面的ack方法,只会ack一条,而不会将100条数据都ack,通过查看官网,发现TupleWindow的ack还真有点不一样的地方,官网文档如下:
Guarentees
The windo