如何在BaseRichSpout的fail()方法中找到失败的根源--Apache Storm?

时间:2016-09-13 10:43:58

标签: java apache-storm

我的拓扑结构如下:

Spout --> Bolt 1 --> Bolt2 --> Bolt3

Spout有一个由 Bolt2 订阅的流"mystream",其他流"bolt1stream" Bolt1 接收元组的地方。

如果元组失败(在我的情况下是Bolt2),我想从Bolt2重播它不再从Bolt1重播

为此,我将在Bolt2中失败。当此失败消息到达spout时,我会根据失败的点将其发送到mystream / bolt1stream。所以它将从失败点开始处理。

然而BaseRichSpout中的fail()具有Object参数,而不是Tuple。我怎么知道sourceComponent,就像我对Tuple一样?或者从失败的地方重播元组的最佳方法是什么。

提前致谢

1 个答案:

答案 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
}