package resa.migrate;
import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by ding on 14-7-16.
*/
public class RedisInputStream extends InputStream {
private Jedis jedis;
private byte[] buf;
private int pos = 0;
private byte[] queueName;
private int listPos = 0;
private final int chunkCount;
private RedisInputStream(Jedis jedis, String queueName) {
this.jedis = jedis;
this.queueName = queueName.getBytes();
chunkCount = jedis.llen(queueName).intValue();
}
public static RedisInputStream create(String host, int port, String queueName) {
try {
Jedis jedis = new Jedis(host, port);
return jedis.exists(queueName) ? new RedisInputStream(jedis, queueName) : null;
} catch (Exception e) {
}
return null;
}
@Override
public int read() throws IOException {
byte[] bytes = new byte[1];
return read(bytes) > 0 ? (bytes[0] & 0xFF) : -1;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int remain = len;
while (remain > 0) {
if (buf == null) {
if (listPos >= chunkCount) {
break;
} else {
buf = jedis.lindex(this.queueName, listPos);
pos = 0;
}
listPos++;
}
int size = Math.min(remain, buf.length - pos);
System.arraycopy(buf, pos, b, off + (len - remain), size);
remain -= size;
pos += size;
if (pos == buf.length) {
buf = null;
}
}
return remain == len ? -1 : len - remain;
}
@Override
public void close() throws IOException {
jedis.disconnect();
buf = null;
}
}