All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kiwiproject.consul.util.LeaderElectionUtil Maven / Gradle / Ivy

package org.kiwiproject.consul.util;

import org.kiwiproject.consul.Consul;
import org.kiwiproject.consul.KeyValueClient;
import org.kiwiproject.consul.model.kv.Value;
import org.kiwiproject.consul.model.session.ImmutableSession;
import org.kiwiproject.consul.model.session.Session;

import java.util.Optional;

public class LeaderElectionUtil {

    private final Consul client;

    public LeaderElectionUtil(Consul client) {
        this.client = client;
    }

    public Optional getLeaderInfoForService(final String serviceName) {
        String key = getServiceKey(serviceName);
        Optional value = client.keyValueClient().getValue(key);
        return value.flatMap(val -> {
            if (val.getSession().isPresent()) {
                return val.getValueAsString();
            }
            return Optional.empty();
        });
    }

    public Optional electNewLeaderForService(final String serviceName, final String info) {
        final String key = getServiceKey(serviceName);
        String sessionId = createSession(serviceName);
        if (client.keyValueClient().acquireLock(key, info, sessionId)) {
            return Optional.of(info);
        } else {
            return getLeaderInfoForService(serviceName);
        }
    }

    public boolean releaseLockForService(final String serviceName) {
        final String key = getServiceKey(serviceName);
        KeyValueClient kv = client.keyValueClient();
        Optional value = kv.getValue(key);
        if (value.isPresent() && value.get().getSession().isPresent()) {
            return kv.releaseLock(key, value.get().getSession().get());
        } else {
            return true;
        }
    }


    private String createSession(String serviceName) {
        final Session session = ImmutableSession.builder().name(serviceName).build();
        return client.sessionClient().createSession(session).getId();
    }

    private static String getServiceKey(String serviceName) {
        return "service/" + serviceName + "/leader";
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy