package org.krakenapps.logdb.query.command; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.krakenapps.api.Primitive; import org.krakenapps.logdb.LogQueryCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RpcFrom extends LogQueryCommand implements Runnable { private final Logger logger = LoggerFactory.getLogger(RpcTo.class.getName()); /** * mapreduce query guid */ private String guid; private Thread t; private volatile boolean end; private AtomicInteger counter; private LinkedBlockingQueue<LogMap> queue; public RpcFrom(String guid) { this.guid = guid; this.queue = new LinkedBlockingQueue<LogMap>(); this.counter = new AtomicInteger(); } @Override public void run() { while (!end) { try { LogMap data = queue.poll(100, TimeUnit.MILLISECONDS); if (data != null) { write(data); counter.incrementAndGet(); } } catch (InterruptedException e) { } } // process all remainings while (true) { LogMap data = queue.poll(); if (data == null) break; write(data); counter.incrementAndGet(); } logger.info("kraken logdb: rpcfrom pass total [{}], remain [{}]", counter.get(), queue.size()); super.eof(); logger.info("kraken logdb: closed rpc reducer stream for query guid [{}]", guid); } @Override public void push(LogMap m) { if (end) { logger.info("kraken logdb: loss (will be fixed) - {}", Primitive.stringify(m)); return; } if (t == null) { t = new Thread(this, "RPC Reducer [" + guid + "]"); t.start(); } queue.add(m); } @Override public boolean isReducer() { return false; } @Override public void start() { status = Status.Running; } @Override public void eof() { this.status = Status.Finalizing; end = true; logger.info("kraken logdb: eof for query guid [{}]", guid); } @Override public String toString() { return "RPC Reducer [" + guid + "] - " + queue.size(); } }