package jp.co.cyberagent.stf.io; import com.google.protobuf.GeneratedMessageLite; import java.io.IOException; import java.io.OutputStream; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MessageWriter implements MessageWritable { private ExecutorService executor = Executors.newSingleThreadExecutor(); private OutputStream out; public static interface Writable { public void write(final GeneratedMessageLite message); } public MessageWriter(OutputStream out) { this.out = out; } public void write(final GeneratedMessageLite message) { executor.submit(new Runnable() { @Override public void run() { try { message.writeDelimitedTo(out); } catch (IOException e) { // The socket went away executor.shutdownNow(); } } }); } public static class Pool implements MessageWritable { Set<MessageWriter> writers = Collections.synchronizedSet(new HashSet<MessageWriter>()); public void add(MessageWriter writer) { writers.add(writer); } public void remove(MessageWriter writer) { writers.remove(writer); } public void write(final GeneratedMessageLite message) { for (MessageWriter writer : writers) { writer.write(message); } } } }