2014-06-17 12 views
5

mam topologii, na przykład składającego się z 1 wylewka i 4 sworzniezatrzymania przetwarzania krotki w niektórych śruby

spout A -> bolt B -> bolt C -> bolt E 
        -> bolt D 

tylko jeśli pewne warunkowego stwierdzenie w śrubę B jest prawdziwe wtedy przechodzi krotki do śruby C śruby D .

i tylko jeśli niektóre warunkowe oświadczenie w śruby C jest prawdziwe wtedy przechodzi krotki do śrub E.

Więc jeden krotki mogą dotrzeć tylko śruby (śruba B lub C i D).

Używam BaseBasicBolt, który według mojej wiedzy jest automatycznie wywoływany po wywołaniu metody collector.emit.

Na przykład wykonać metoda śruby B jest jak poniżej

public class boltB extends BaseBasicBolt { 
    public void execute(Tuple tuple, BasicOutputCollector collector) { 
     ...some logic goes here 
     if (response.getCount() > 0) { 
      collector.emit(new Values(tuple.getString(0))); 
     } 
    } 
} 

Więc jeśli collector.emit nie nazywa, myślę krotka z wylewką nie powiodła się, bo widzę z burzy ui że prawie wszystkie krotki z wylewem nie powiodło się.

W takim przypadku, gdzie powinienem nazywać "ack", aby nie brać pod uwagę, że jest to nieudana krotka?

Odpowiedz

6

To, co robisz, jest poprawne dla wprowadzanej logiki. Nie musisz jednoznacznie dzwonić pod numer ack(). Podczas korzystania z BaseBasicBolt, każda krotka jest potwierdzana po metodzie execute() przez BasicBoltExecutor. W przypadku nieudanych krotek powinieneś sprawdzić wyjątki. Również spróbuj spojrzeć na Storm UI dla anomalii w krotce emitowanej/wykonanej/nieudanej dla każdej wylewki i śruby.

4

Kiedy masz BaseBasicBolt - potwierdzenie jest dla ciebie, nawet jeśli nic nie emitujesz.

Instancja BaseBasicBolt jest wykonywany w BasicBoltExecutor, którego execute() metoda jest pokazany poniżej:

public void execute(Tuple input) { 
    _collector.setContext(input); 
    try { 
     _bolt.execute(input, _collector); 
     _collector.getOutputter().ack(input); 
    } catch(FailedException e) { 
     if(e instanceof ReportedFailedException) { 
      _collector.reportError(e); 
     } 
     _collector.getOutputter().fail(input); 
    } 
} 

Więc w celu zaprzestania przetwarzania krotki, tylko nie emitują, po tym jak go wykonać połączenie, zostanie potwierdzony. Ponieważ nie ma już żadnych śrub do uruchomienia połączenia potwierdzenia w wylocie, będzie ono nazywane

Mam nadzieję, że to odpowiedź na twoje pytania