org.skfiy.typhon.jmx.BuiltinJmxListener.java Source code

Java tutorial

Introduction

Here is the source code for org.skfiy.typhon.jmx.BuiltinJmxListener.java

Source

/*
 * Copyright 2013 The Skfiy Open Association.
 *
 * 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.skfiy.typhon.jmx;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;
import javax.management.MBeanServer;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.commons.modeler.Registry;
import org.skfiy.typhon.Lifecycle;
import org.skfiy.typhon.LifecycleEvent;
import org.skfiy.typhon.LifecycleListener;
import org.skfiy.typhon.TyphonException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Kevin Zou <kevinz@skfiy.org>
 */
public class BuiltinJmxListener implements LifecycleListener {

    private static final Logger LOG = LoggerFactory.getLogger(BuiltinJmxListener.class);

    private String host = "localhost";
    private int port = 1090;

    private JMXConnectorServer jcs;

    @Override
    public void execute(LifecycleEvent event) {
        if (Lifecycle.BEFORE_INIT_EVENT.equals(event.getEvent())) {

            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
            Registry.getRegistry(null, null).setMBeanServer(mbs);
        } else if (Lifecycle.AFTER_INIT_EVENT.equals(event.getEvent())) {
            // Ensure cryptographically strong random number generator used
            // to choose the object number - see java.rmi.server.ObjID
            //
            System.setProperty("java.rmi.server.randomIDs", "true");

            // Start an RMI registry on port.
            try {
                LocateRegistry.createRegistry(port);
                LOG.info("Create RMI registry on port {}", port);
            } catch (RemoteException ex) {
                LOG.error("Create RMI registry error", ex);
                throw new TyphonException(ex);
            }

            Map<String, Object> env = new HashMap<>();

            // Provide the password file used by the connector server to
            // perform user authentication. The password file is a properties
            // based text file specifying username/password pairs.
            //
            // File file = new File(System.getProperty("typhon.home"), "bin/jmxremote.password");
            // env.put("com.sun.management.jmxremote.password.file", file.getAbsolutePath());

            try {
                jcs = JMXConnectorServerFactory.newJMXConnectorServer(newUrl(), env,
                        ManagementFactory.getPlatformMBeanServer());
                jcs.start();
            } catch (IOException ex) {
                LOG.error("start JMXConnectorServer...", ex);
                throw new TyphonException(ex);
            }
        } else if (Lifecycle.AFTER_DESTROY_EVENT.equals(event.getEvent())) {
            if (jcs != null) {
                try {
                    jcs.stop();
                } catch (IOException ex) {
                    LOG.error("stop JMXConnectorServer...", ex);
                    throw new TyphonException(ex);
                }
            }
        }
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    private JMXServiceURL newUrl() {
        try {
            return new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi");
        } catch (MalformedURLException ex) {
            throw new IllegalArgumentException(ex);
        }
    }

}