org.springframework.yarn.examples.grid.hazelcast.HazelcastContainerGrid.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.yarn.examples.grid.hazelcast.HazelcastContainerGrid.java

Source

/*
 * Copyright 2013 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 org.springframework.yarn.examples.grid.hazelcast;

import java.util.Collection;
import java.util.HashMap;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.SmartLifecycle;
import org.springframework.yarn.examples.grid.CompositeContainerGridListener;
import org.springframework.yarn.examples.grid.ContainerGrid;
import org.springframework.yarn.examples.grid.ContainerGridListener;
import org.springframework.yarn.examples.grid.ContainerNode;

import com.hazelcast.config.Config;
import com.hazelcast.core.Cluster;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.MembershipEvent;
import com.hazelcast.core.MembershipListener;

/**
 * Container grid implementation on top of Hazelcast.
 *
 * @author Janne Valkealahti
 *
 */
public class HazelcastContainerGrid implements ContainerGrid<ContainerNode>, InitializingBean, SmartLifecycle {

    private final static Log log = LogFactory.getLog(HazelcastContainerGrid.class);

    private Config config = new Config();
    private HazelcastInstance hazelcastInstance;
    private final ReentrantLock lifecycleLock = new ReentrantLock();
    private volatile boolean autoStartup = true;
    private volatile int phase = 0;
    private volatile boolean running;
    private HashMap<String, ContainerNode> nodes = new HashMap<String, ContainerNode>();
    private CompositeContainerGridListener<ContainerNode> containerGridListener = new CompositeContainerGridListener<ContainerNode>();

    @Override
    public Collection<ContainerNode> getContainerNodes() {
        return nodes.values();
    }

    @Override
    public ContainerNode getContainerNode(String id) {
        return nodes.get(id);
    }

    @Override
    public void addContainerNode(ContainerNode node) {
        nodes.put(node.getId(), node);
        containerGridListener.containerNodeAdded(node);
    }

    @Override
    public void removeContainerNode(String id) {
        ContainerNode node = nodes.remove(id);
        containerGridListener.containerNodeRemoved(node);
    }

    @Override
    public void addContainerGridListener(ContainerGridListener<ContainerNode> listener) {
        containerGridListener.register(listener);
    }

    @Override
    public void start() {
        lifecycleLock.lock();
        try {
            if (!running) {
                running = true;
                init();
                if (log.isInfoEnabled()) {
                    log.info("started " + this);
                } else {
                    if (log.isDebugEnabled()) {
                        log.debug("already started " + this);
                    }
                }
            }
        } finally {
            lifecycleLock.unlock();
        }

    }

    @Override
    public void stop() {
        lifecycleLock.lock();
        try {
            if (running) {
                hazelcastInstance.getLifecycleService().shutdown();
                running = false;
                if (log.isInfoEnabled()) {
                    log.info("stopped " + this);
                }
            } else {
                if (log.isDebugEnabled()) {
                    log.debug("already stopped " + this);
                }
            }
        } finally {
            lifecycleLock.unlock();
        }
    }

    @Override
    public boolean isRunning() {
        lifecycleLock.lock();
        try {
            return running;
        } finally {
            lifecycleLock.unlock();
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {

    }

    @Override
    public int getPhase() {
        return phase;
    }

    @Override
    public boolean isAutoStartup() {
        return autoStartup;
    }

    @Override
    public void stop(Runnable callback) {
        lifecycleLock.lock();
        try {
            stop();
            callback.run();
        } finally {
            lifecycleLock.unlock();
        }
    }

    public void setPhase(int phase) {
        this.phase = phase;
    }

    public void setAutoStartup(boolean autoStartup) {
        this.autoStartup = autoStartup;
    }

    public void setHazelcastConfig(Config config) {
        this.config = config;
    }

    private void init() {
        hazelcastInstance = Hazelcast.newHazelcastInstance(config);
        Cluster cluster = hazelcastInstance.getCluster();
        cluster.addMembershipListener(new MembershipListener() {
            public void memberAdded(MembershipEvent membersipEvent) {
                log.info("MemberAdded " + membersipEvent);
                addContainerNode(new HazelcastContainerNode(membersipEvent.getMember().getUuid()));
            }

            public void memberRemoved(MembershipEvent membersipEvent) {
                log.info("MemberRemoved " + membersipEvent);
                removeContainerNode(membersipEvent.getMember().getUuid());
            }
        });
    }

    public static class HazelcastContainerNode implements ContainerNode {

        private final String id;

        public HazelcastContainerNode(String id) {
            this.id = id;
        }

        @Override
        public String getId() {
            return id;
        }

    }

}