package qa.qcri.aidr.collector.collectors; import java.io.Closeable; import java.io.IOException; import java.util.logging.Logger; import javax.json.JsonObject; import org.apache.commons.lang3.text.translate.UnicodeEscaper; import qa.qcri.aidr.collector.utils.CollectorConfigurator; import qa.qcri.aidr.collector.utils.CollectorConfigurationProperty; import qa.qcri.aidr.collector.utils.CollectorErrorLog; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.exceptions.JedisConnectionException; /** * Jedis factory class to generate new Jedis instances. * Pulished JSON objects or text messages on Redis channels. */ public class JedisPublisher implements Closeable, Publisher { private static Logger logger = Logger.getLogger(JedisPublisher.class.getName()); private static CollectorConfigurator configProperties=CollectorConfigurator.getInstance(); private static UnicodeEscaper unicodeEscaper = UnicodeEscaper.above(127); private static JedisPool jedisPool; static { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(40); poolConfig.setMinIdle(20); poolConfig.setMaxTotal(500); poolConfig.setTestOnBorrow(true); poolConfig.setTestOnReturn(true); poolConfig.setTestWhileIdle(true); poolConfig.setTimeBetweenEvictionRunsMillis(30000); jedisPool = new JedisPool(poolConfig, configProperties.getProperty(CollectorConfigurationProperty.REDIS_HOST), Integer.valueOf(configProperties.getProperty(CollectorConfigurationProperty.REDIS_PORT)), 0); } public static JedisPublisher newInstance() { try { Jedis jedis = jedisPool.getResource(); logger.info("Allocated new jedis resource: " + jedis); return new JedisPublisher(jedis); } catch (JedisConnectionException e) { logger.severe("Could not establish Redis connection. Is Redis running?"); CollectorErrorLog.sendErrorMail("Redis Connection", e.getMessage()); throw e; } } private Jedis delegate; public Jedis getDelegate() { return delegate; } protected JedisPublisher(Jedis instance) { this.delegate = instance; } @Override public void close() throws IOException { logger.info("Returned jedis resource: " + delegate); jedisPool.returnResource(delegate); } @Override public void publish(String channel, JsonObject doc) { publish(channel, unicodeEscaper.translate(doc.toString())); } @Override public void publish(String channel, String message) { delegate.publish(channel, unicodeEscaper.translate(message)); } }