org.nuxeo.ecm.core.redis.RedisServerDescriptor.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.ecm.core.redis.RedisServerDescriptor.java

Source

/*
 * (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser General Public License
 * (LGPL) version 2.1 which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-2.1.html
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * Contributors:
 *     Florent Guillaume
 */
package org.nuxeo.ecm.core.redis;

import org.apache.commons.lang.StringUtils;
import org.nuxeo.common.xmap.annotation.XNode;
import org.nuxeo.common.xmap.annotation.XObject;
import org.nuxeo.ecm.core.api.NuxeoException;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Protocol;

/**
 * Descriptor for a Redis configuration.
 *
 * @since 5.8
 */
@XObject("server")
public class RedisServerDescriptor extends RedisPoolDescriptor {

    @XNode("hosts")
    public RedisHostDescriptor[] hosts = new RedisHostDescriptor[0];

    @XNode("host")
    public void setHost(String name) {
        if (hosts.length == 0) {
            hosts = new RedisHostDescriptor[] { new RedisHostDescriptor(name, Protocol.DEFAULT_PORT) };
        } else {
            hosts[0].name = name;
        }
    }

    @XNode("port")
    public void setHost(int port) {
        if (hosts.length == 0) {
            hosts = new RedisHostDescriptor[] { new RedisHostDescriptor("localhost", port) };
        } else {
            hosts[0].port = port;
        }
    }

    public RedisHostDescriptor selectHost() {
        for (RedisHostDescriptor host : hosts) {
            if (canConnect(host.name, host.port)) {
                return host;
            }
        }
        throw new NuxeoException("Cannot connect to jedis hosts");
    }

    protected boolean canConnect(String name, int port) {
        try (Jedis jedis = new Jedis(name, port)) {
            return canPing(jedis);
        }
    }

    protected boolean canPing(Jedis jedis) {
        try {
            String pong = jedis.ping();
            return "PONG".equals(pong);
        } catch (Exception cause) {
            return false;
        }
    }

    @Override
    public RedisExecutor newExecutor() {
        if (hosts.length == 0) {
            throw new RuntimeException("Missing Redis host");
        }
        if (hosts.length > 1) {
            throw new RuntimeException("Only one host supported");
        }
        RedisHostDescriptor host = selectHost();
        return new RedisPoolExecutor(new JedisPool(new JedisPoolConfig(), host.name, host.port, timeout,
                StringUtils.defaultIfBlank(password, null), database));

    }
}