我的拓扑结构如下:
Spout --> Bolt 1 --> Bolt2 --> Bolt3
Spout有一个由 Bolt2 订阅的流"mystream"
,其他流"bolt1stream"
是 Bolt1 接收元组的地方。
如果元组失败(在我的情况下是Bolt2),我想从Bolt2重播它不再从Bolt1重播
为此,我将在Bolt2中失败。当此失败消息到达spout时,我会根据失败的点将其发送到mystream / bolt1stream。所以它将从失败点开始处理。
然而BaseRichSpout
中的fail()具有Object参数,而不是Tuple。我怎么知道sourceComponent
,就像我对Tuple一样?或者从失败的地方重播元组的最佳方法是什么。
提前致谢
答案 0 :(得分:0)
对于每个流,我使用一个单独的类来标识流。另一种方法是使用相同的类,并在类中包含标识流的整数或枚举。
@Override
public void fail(Object msgId) {
if (msgId instanceof MyTupleClass) {
// Default stream
MyTupleClass oneTuple = (MyTupleClass) msgId;
//---tuple replay logic. Re-emitting the failed tuples
ReEmitTheDefaultStreamTuple(oneTuple);
}
else {
//it's the other stream
//For this stream you could perhaps use MySecondTupleClass
}