package org.hackreduce.storm;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
/**
* Date: 7/19/13
* Time: 8:57 PM
*
* @author ikaplun
*/
public class FilePersistBolt extends BaseRichBolt {
private static final Logger LOG = LoggerFactory.getLogger(FilePersistBolt.class);
private BufferedWriter writer;
private OutputCollector outputCollector;
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
String filepath = (String) map.get("persist.file");
String absoluteFileName = filepath+"."+topologyContext.getThisTaskIndex();
this.outputCollector=outputCollector;
try {
writer = new BufferedWriter(new FileWriter(absoluteFileName));
} catch (IOException e) {
// this will propagate the error to storm
throw new RuntimeException("Problem opening file " +absoluteFileName,e);
}
}
@Override
public void execute(Tuple tuple) {
String line = tuple.getStringByField("line");
LOG.info(line);
try {
writer.write(line);
writer.flush();
outputCollector.ack(tuple);
} catch (IOException e) {
outputCollector.fail(tuple);
throw new RuntimeException("Problem writing to file",e);
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
//nothing here since we are not emitting anything
}
}