package resa.migrate;
import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
/**
* Created by ding on 14-7-15.
*/
public class RedisOutputStream extends OutputStream {
private int chunkSize;
private Jedis jedis;
private byte[] buf;
private int pos = 0;
private byte[] queueName;
public RedisOutputStream(String host, int port, String queueName) {
this(host, port, queueName, true);
}
public RedisOutputStream(String host, int port, String queueName, boolean overwrite) {
this(host, port, queueName, overwrite, 1 << 20);
}
public RedisOutputStream(String host, int port, String queueName, boolean overwrite, int chunkSize) {
jedis = new Jedis(host, port);
buf = new byte[chunkSize];
this.chunkSize = chunkSize;
this.queueName = queueName.getBytes();
if (overwrite) {
jedis.del(queueName);
}
}
@Override
public void write(int b) throws IOException {
if (pos == buf.length) {
finishChunk(false);
}
buf[pos++] = (byte) b;
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
int retain = len;
while (retain > 0) {
int copySize = Math.min(retain, buf.length - pos);
System.arraycopy(b, off + (len - retain), buf, pos, copySize);
retain -= copySize;
pos += copySize;
if (pos == buf.length) {
finishChunk(false);
}
}
}
@Override
public void flush() throws IOException {
finishChunk(false);
}
private void finishChunk(boolean close) {
if (pos != 0) {
byte[] output = pos == buf.length ? buf : Arrays.copyOf(buf, pos);
jedis.rpush(queueName, output);
pos = 0;
buf = close ? null : new byte[chunkSize];
}
}
@Override
public void close() throws IOException {
finishChunk(true);
jedis.disconnect();
}
}