package org.bigbluebutton.app.screenshare.store.redis;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisDataStore {
private static Logger log = Red5LoggerFactory.getLogger(RedisDataStore.class, "screenshare");
private JedisPool redisPool;
private volatile boolean sendMessage = false;
private int maxThreshold = 1024;
private final Executor msgSenderExec = Executors.newSingleThreadExecutor();
private BlockingQueue<IScreenShareData> dataToStore = new LinkedBlockingQueue<IScreenShareData>();
private final Executor runExec = Executors.newSingleThreadExecutor();
public void stop() {
sendMessage = false;
}
public void start() {
try {
sendMessage = true;
Runnable messageSender = new Runnable() {
public void run() {
while (sendMessage) {
try {
IScreenShareData data = dataToStore.take();
storeData(data);
} catch (InterruptedException e) {
log.warn("Failed to get data from queue.");
}
}
}
};
msgSenderExec.execute(messageSender);
} catch (Exception e) {
log.error("Error storing data into redis: " + e.getMessage());
}
}
public void store(IScreenShareData data) {
if (dataToStore.size() > maxThreshold) {
log.warn("Queued number of data [{}] is greater than threshold [{}]", dataToStore.size(), maxThreshold);
}
dataToStore.add(data);
}
private void storeData(IScreenShareData data) {
Runnable task = new Runnable() {
public void run() {
Jedis jedis = redisPool.getResource();
try {
// jedis.publish(channel, message);
} catch(Exception e){
log.warn("Cannot publish the message to redis", e);
} finally {
redisPool.returnResource(jedis);
}
}
};
runExec.execute(task);
}
public void setRedisPool(JedisPool redisPool){
this.redisPool = redisPool;
}
public void setMaxThreshold(int threshold) {
maxThreshold = threshold;
}
}