package com.jointhegrid.ironcount.caligraphy; import com.jointhegrid.ironcount.manager.MessageHandler; import com.jointhegrid.ironcount.manager.WorkerThread; import com.jointhegrid.ironcount.manager.Workload; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import kafka.message.Message; import kafka.message.MessageAndMetadata; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class CaligraphyMessageHandler implements MessageHandler { private Workload w; private WorkerThread wt; private Map<String,Writer> outs; FileSystem fs; public CaligraphyMessageHandler(){ outs=new HashMap<String,Writer>(); } @Override public void setWorkload(Workload w) { this.w=w; } @Override public void handleMessage(MessageAndMetadata<Message> m) { String s = getMessage(m.message()); String key = s.substring(0,s.indexOf("|")); String rest = s.substring(s.indexOf("|")+1); if ( this.outs.containsKey(key) ){ try { this.outs.get(key).write(rest+"\n"); } catch (IOException ex) { Logger.getLogger(CaligraphyMessageHandler.class.getName()).log(Level.SEVERE, null, ex); } } else { try { BufferedWriter bw = new BufferedWriter( new OutputStreamWriter (fs.create(new Path("/tmp/events", key) ))); this.outs.put(key, bw); this.outs.get(key).write(rest+"\n"); } catch (IOException ex) { Logger.getLogger(CaligraphyMessageHandler.class.getName()).log(Level.SEVERE, null, ex); } } } @Override public void setWorkerThread(WorkerThread wt) { this.wt=wt; Configuration conf = new Configuration(); try { //in 'real' life you would do something like this //conf.set("fs.default.name", w.properties.get("fs.default.name")); fs = FileSystem.get(conf); } catch (IOException ex) { Logger.getLogger(CaligraphyMessageHandler.class.getName()).log(Level.SEVERE, null, ex); } } public static String getMessage(Message message) { ByteBuffer buffer = message.payload(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); return new String(bytes); } @Override public void stop() { for (Map.Entry<String,Writer> entry: this.outs.entrySet() ){ if (entry.getValue()!=null){ try { entry.getValue().flush(); entry.getValue().close(); } catch (IOException ex) { } } } } }