com.flipkart.aesop.runtime.clusterclient.DefaultClusterClientFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.flipkart.aesop.runtime.clusterclient.DefaultClusterClientFactory.java

Source

/*
 * Copyright 2012-2015, the original author or authors.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.flipkart.aesop.runtime.clusterclient;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import org.trpr.platform.core.impl.logging.LogFactory;
import org.trpr.platform.core.spi.logging.Logger;

import com.flipkart.aesop.runtime.client.DefaultClient;
import com.flipkart.aesop.runtime.config.ClientClusterConfig;
import com.flipkart.aesop.runtime.config.ClusterRegistration;
import com.linkedin.databus.client.DatabusHttpClientImpl;
import com.linkedin.databus.client.pub.DatabusRegistration;
import com.linkedin.databus.client.pub.DbusClusterConsumerFactory;
import com.linkedin.databus.client.pub.DbusModPartitionedFilterFactory;
import com.linkedin.databus.client.pub.DbusPartitionListener;
import com.linkedin.databus.client.pub.DbusServerSideFilterFactory;
import com.linkedin.databus.core.util.ConfigLoader;

/**
 * The Spring factory bean for creating {@link DefaultClient} instances based on configured properties
 * @author Jagadeesh Huliyar
 */

public class DefaultClusterClientFactory implements FactoryBean<DefaultClient>, InitializingBean {
    private ClientClusterConfig clientClusterConfig;
    private List<ClusterRegistration> clusterRegistrations;
    private List<DatabusRegistration> databusRegistrations = new ArrayList<DatabusRegistration>();
    private DefaultClient databusClient;
    private static final Logger logger = LogFactory.getLogger(DefaultClusterClientFactory.class);

    /**
     * Interface method implementation. Checks for mandatory dependencies and initializes this Relay Client
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
    public void afterPropertiesSet() throws Exception {
        Assert.notNull(this.clientClusterConfig,
                "'clientClusterConfig' cannot be null. This Relay Cluster Client will not be initialized");
        Assert.notEmpty(this.clusterRegistrations,
                "'clusterRegistrations' cannot be empty. No Cluster Registrations.");
    }

    @Override
    public DefaultClient getObject() throws Exception {
        DatabusHttpClientImpl.Config config = new DatabusHttpClientImpl.Config();
        ConfigLoader<DatabusHttpClientImpl.StaticConfig> staticConfigLoader = new ConfigLoader<DatabusHttpClientImpl.StaticConfig>(
                clientClusterConfig.getClientPropertiesPrefix(), config);
        Properties properties = this.clientClusterConfig.getClientProperties();
        DatabusHttpClientImpl.StaticConfig staticConfig = staticConfigLoader.loadConfig(properties);
        databusClient = new DefaultClient(staticConfig);
        // register all Cluster registrations with the Relay Client
        for (ClusterRegistration clusterRegistration : clusterRegistrations) {
            String clusterName = clusterRegistration.getClusterName();
            DbusPartitionListener partitionListener = clusterRegistration.getPartitionListener();
            DbusClusterConsumerFactory consumerFactory = clusterRegistration.getConsumerFactory();
            List<String> logicalSources = clusterRegistration.getLogicalSources();
            String[] logicalSourcesArr = logicalSources.toArray(new String[0]);
            DbusServerSideFilterFactory filterFactory = clusterRegistration.getFilterFactory();
            if (filterFactory == null) {
                filterFactory = new DbusModPartitionedFilterFactory(logicalSourcesArr);
            }
            DatabusRegistration registration = databusClient.registerCluster(clusterName, consumerFactory,
                    filterFactory, partitionListener, logicalSourcesArr);
            databusRegistrations.add(registration);
        }
        //Start all registrations now
        for (DatabusRegistration databusRegistration : databusRegistrations) {
            databusRegistration.start();
        }
        logger.info("Adding shutdown hook");
        Runtime.getRuntime().addShutdownHook(new ClusterShutDownHookThread());
        logger.info("Added shutdown hook");
        return databusClient;
    }

    private class ClusterShutDownHookThread extends Thread {
        @Override
        public void run() {
            logger.info("ClusterShutDownHookThread getting executed. Shutting down Client");
            databusClient.shutdown();
            logger.info("ClusterShutDownHookThread executed. Client shutdown complete");
        }
    }

    @Override
    public Class<?> getObjectType() {
        return DefaultClient.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    /**
     * @return the clientClusterConfig
     */
    public ClientClusterConfig getClientClusterConfig() {
        return clientClusterConfig;
    }

    /**
     * @param clientClusterConfig the clientClusterConfig to set
     */
    public void setClientClusterConfig(ClientClusterConfig clientClusterConfig) {
        this.clientClusterConfig = clientClusterConfig;
    }

    /**
     * @return the clusterRegistrations
     */
    public List<ClusterRegistration> getClusterRegistrations() {
        return clusterRegistrations;
    }

    /**
     * @param clusterRegistrations the clusterRegistrations to set
     */
    public void setClusterRegistrations(List<ClusterRegistration> clusterRegistrations) {
        this.clusterRegistrations = clusterRegistrations;
    }

}