package com.kspichale.strom_demo;
import java.util.Date;
import java.util.Map;
import org.mortbay.log.Log;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import backtype.storm.utils.Utils;
@SuppressWarnings("rawtypes")
public class RankingListBolt implements IRichBolt {
private static final long serialVersionUID = 1202638526061367283L;
private RankingList rankingList = new RankingList();
OutputCollector collector;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
// A thread will periodically report the latest ranking list
Thread reporter = new Thread() {
public void run() {
while (true) {
Log.info("Reporting start.");
synchronized (rankingList) {
rankingList.sortAndTrim();
for (final ListItem item : rankingList) {
System.out.println(item);
RankingListBolt.this.collector.emit(new Values(item.getUrl(), item.getDateTime(), item.getCount()));
}
}
Log.info("Reporting finished.");
Utils.sleep(1000);
}
};
};
reporter.start(); // we don't care about properly finalizing this thread
// in this toy example...
}
@Override
public void execute(Tuple input) {
final String url = input.getString(0);
final Date date = (Date) input.getValue(1);
final long count = input.getLong(2);
final ListItem item = new ListItem(url, date, count);
synchronized (rankingList) {
rankingList.add(item);
}
}
@Override
public void cleanup() {
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("url", "date", "count"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}