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

com.englishtown.vertx.zookeeper.impl.DefaultZooKeeperClient Maven / Gradle / Ivy

The newest version!
package com.englishtown.vertx.zookeeper.impl;

import com.englishtown.vertx.zookeeper.ZooKeeperClient;
import com.englishtown.vertx.zookeeper.ZooKeeperConfigurator;
import com.englishtown.vertx.zookeeper.ZooKeeperOperation;
import io.vertx.core.*;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import org.apache.curator.ensemble.EnsembleProvider;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.framework.api.CuratorWatcher;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;

import static org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import static org.apache.curator.framework.CuratorFrameworkFactory.builder;

/**
 */
public class DefaultZooKeeperClient implements ZooKeeperClient {

    private final Vertx vertx;
    private final List>> onReadyCallbacks = new ArrayList<>();

    private CuratorFramework framework;
    private AsyncResult initResult;

    private static final Logger logger = LoggerFactory.getLogger(DefaultZooKeeperClient.class);

    @Inject
    public DefaultZooKeeperClient(Vertx vertx, ZooKeeperConfigurator configurator) {
        this.vertx = vertx;

        configurator.onReady(result -> {
            if (result.failed()) {
                initResult = result;
            } else {
                try {
                    initResult = init(configurator);
                } catch (Throwable t) {
                    initResult = Future.failedFuture(t);
                }
            }
            runOnReadyCallbacks(initResult);
        });

    }

    private DefaultZooKeeperClient(Vertx vertx, CuratorFramework framework, AsyncResult initResult) {
        this.vertx = vertx;
        this.framework = framework;
        this.initResult = initResult;
    }

    private AsyncResult init(ZooKeeperConfigurator configurator) throws Exception {

        Builder builder = builder().retryPolicy(configurator.getRetryPolicy());

        ZooKeeperConfigurator.AuthPolicy auth = configurator.getAuthPolicy();
        if (auth != null) {
            builder.authorization(auth.geScheme(), auth.getAuth().getBytes());
        }

        EnsembleProvider ensembleProvider = configurator.getEnsembleProvider();
        if (ensembleProvider != null) {
            builder.ensembleProvider(ensembleProvider);
        } else {
            builder.connectString(configurator.getConnectionString());
        }

        framework = builder.build();
        framework.start();
        framework.getZookeeperClient().getZooKeeper();

        logger.info("Zookeeper has successfully started");
        return Future.succeededFuture();
    }

    private void runOnReadyCallbacks(AsyncResult result) {
        initResult = result;
        onReadyCallbacks.forEach(handler -> handler.handle(result));
        onReadyCallbacks.clear();
    }

    @Override
    public CuratorFramework getCuratorFramework() {
        return framework;
    }

    @Override
    public void execute(ZooKeeperOperation operation, Handler> handler) {
        try {
            operation.execute(this, wrapHandler(handler));
        } catch (Exception e) {
            handler.handle(Future.failedFuture(e));
        }
    }

    @Override
    public ZooKeeperClient usingNamespace(String namespace) {
        if (!initialized() || framework == null) {
            throw new IllegalStateException("Cannot call usingNamespace() until after onReady() successfully completes");
        }
        return new DefaultZooKeeperClient(vertx, framework.usingNamespace(namespace), initResult);
    }

    @Override
    public boolean initialized() {
        return initResult != null;
    }

    @Override
    public void onReady(Handler> callback) {
        if (initResult != null) {
            callback.handle(initResult);
        } else {
            onReadyCallbacks.add(callback);
        }
    }

    @Override
    public CuratorWatcher wrapWatcher(CuratorWatcher watcher) {
        Context context = vertx.getOrCreateContext();

        return event -> {
            context.runOnContext(aVoid -> {
                try {
                    watcher.process(event);
                } catch (Exception e) {
                    logger.warn("CuratorWatcher threw an exception", e);
                }
            });
        };
    }

    private Handler> wrapHandler(Handler> toWrap) {
        Context context = vertx.getOrCreateContext();

        if (context == null) {
            logger.warn("Current vertx context is null, are you running on the correct thread?");
            return toWrap;
        }

        return (result) -> {
            context.runOnContext(aVoid -> {
                toWrap.handle(result);
            });
        };
    }

    @Override
    public void close() {
        getCuratorFramework().close();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy