Per implementare il BOLT che abbiamo chiamato WordNCounter, creiamo una classe nel package BOLTS e la chiamiamo WordCounter
. Durante la creazione della classe, dobbiamo avere cura di ereditare la classe BaseRichBOLT
. Dunque eseguiamo la stessa procedura descritta prima: parametriziamo la maschera di creazione di una classe come nella figura sottostante:
La classe che viene creata ha la struttura seguente:
public class WordCounter extends BaseRichBOLT {
public void prepare(Map stormConf, TOPOLOGYContext context,
OutputCollector collector) {
}
public void execute(Tuple input) {
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
}
Per effettuare il conteggio delle occorrenze, ci serviremo di una struttura dati nella quale salvare la word e il relativo contatore. In questo caso torna utile una Map: quindi dichiariamo la struttura dati a livello di classe (e la chiamiamo counters
) e la inizializziamo nel metodo prepare()
.
public void prepare(Map stormConf, TOPOLOGYContext context,
OutputCollector collector) {
this.counters = new HashMap<string, integer="">();
}
Nel metodo execute()
di questo BOLT, implementiamo l'algoritmo che ci permette di contare le occorrenze delle parole, tenendole aggiornate in tempo reale:
public void execute(Tuple input) {
String str = input.getStringByField("word");
if(!counters.containsKey(str)){
counters.put(str, 1);
}else{
Integer c = counters.get(str) + 1;
counters.put(str, c);
}
System.out.println(">>>> STATO ELABORAZIONE IN TEMPO REALE");
for(Map.Entry<string, integer=""> entry : counters.entrySet()){
System.out.println(entry.getKey()+": "+entry.getValue());
}
}