package storm.applications.sink;
import backtype.storm.tuple.Tuple;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author mayconbordin
*/
public class AsyncFileSink extends FileSink implements Runnable {
private static final Logger LOG = LoggerFactory.getLogger(AsyncFileSink.class);
private BlockingQueue<String> queue;
private ExecutorService executor;
@Override
public void initialize() {
super.initialize();
queue = new LinkedBlockingQueue<>();
executor = Executors.newSingleThreadExecutor();
executor.submit(this);
}
@Override
public void execute(Tuple tuple) {
try {
queue.add(formatter.format(tuple));
collector.ack(tuple);
} catch (IllegalStateException ex) {
LOG.warn("Queue is full", ex);
}
}
@Override
public void cleanup() {
super.cleanup();
executor.shutdown();
}
@Override
public void run() {
while (true) {
try {
String line = queue.take();
writer.write(line);
writer.newLine();
} catch (InterruptedException ex) {
LOG.error("Unable to get line from queue", ex);
} catch (IOException ex) {
LOG.error("Unable to write line to " + file, ex);
}
}
}
}