2013년 10월 18일 금요일

JMX와 ServletContextListener 를 활용한 원격자원관리

1. DiskStatus.java

package jmx;

import java.io.IOException;
import java.io.PrintWriter;

import javax.management.MalformedObjectNameException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DiskStatus extends HttpServlet {
        private static final long serialVersionUID = 5205766527888153877L;

        public void doGet(HttpServletRequest req, HttpServletResponse res)
                        throws IOException {

                DiskStatusInquiry dsi = new DiskStatusInquiry();

                try {
                        dsi.diskStatus();
                } catch (MalformedObjectNameException e) {
                        e.printStackTrace();
                } catch (NullPointerException e) {
                        e.printStackTrace();
                }
                String dview = dsi.viewDiskCapacity();

                PrintWriter out = res.getWriter();
                out.println(dview);
        }
}


-------------------------------------------------------------------

2. DiskStatusInquiry.java

package jmx;

import java.io.IOException;
import java.net.MalformedURLException;
import java.text.NumberFormat;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.RuntimeErrorException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.commons.io.FileSystemUtils;

public class DiskStatusInquiry implements DiskStatusInquiryMBean {
        public DiskStatusInquiry() {
        }

        public String viewDiskCapacity() {
                StringBuffer status = new StringBuffer();
                long freeSpace=0;

                try {
                        freeSpace = FileSystemUtils.freeSpaceKb("C:/");
                } catch (IOException e) {
                        e.printStackTrace();
                }
                NumberFormat nf = NumberFormat.getInstance();
                status.append("C Drive FreeSpace : ");
                status.append(nf.format(freeSpace));
                status.append("Kb");
               
                return status.toString();
        }

        public void diskStatus() throws MalformedObjectNameException,
                        NullPointerException, IOException {
                ObjectName resourceControlMBeanName = null;
                Map<String, ?> creationEnvironment = null;
                Map<String, ?> connectionEnvironment = null;
                try {
                        resourceControlMBeanName = new ObjectName(
                                        "JmxAgent:name=diskStatus");
                        JMXServiceURL serviceURL = new JMXServiceURL(
                                        "service:jmx:rmi:///jndi/rmi://localhost:7777/server");
                        JMXConnector cntor = JMXConnectorFactory.newJMXConnector(
                                        serviceURL, creationEnvironment);
                        cntor.connect(connectionEnvironment);
                        MBeanServerConnection mbsc = cntor.getMBeanServerConnection();
                        DiskStatusInquiryMBean resource = MBeanServerInvocationHandler
                                        .newProxyInstance(mbsc, resourceControlMBeanName,
                                                        DiskStatusInquiryMBean.class, false);
                        resource.viewDiskCapacity();
                        cntor.close();
                } catch (RuntimeErrorException e) {
                        e.printStackTrace();
                } catch (MalformedURLException e) {
                        e.printStackTrace();
                }
        }
}


-------------------------------------------------------------------

3. DiskStatusInquiryMBean.java

package jmx;

public interface DiskStatusInquiryMBean {
        public String viewDiskCapacity();
}

--------------------------------------------------------------------

4. JmxAgent.java

package jmx;

import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.rmi.RMIConnectorServer;

public class JmxAgent {
        private MBeanServer server = null;

        public JmxAgent() {
                server = MBeanServerFactory.createMBeanServer("JmxAgent");
                initAgent();
        }

        public void initAgent() {
                JMXServiceURL serviceUrl = null;
                ObjectName connectorName = null;
                ObjectName diskStatusInquiryMBeanName = null;

                try {
                        LocateRegistry.createRegistry(7777);
                        serviceUrl = new JMXServiceURL(
                                        "service:jmx:rmi:///jndi/rmi://localhost:7777/server");
                        Map<String, String> environment = new HashMap<String, String>();
                        environment.put(RMIConnectorServer.JNDI_REBIND_ATTRIBUTE, "true");
                        connectorName = new ObjectName("JmxAgent:name=RmiConnector");

                        diskStatusInquiryMBeanName = new ObjectName(
                                        "JmxAgent:name=diskStatus");
                        JMXConnectorServer connector = JMXConnectorServerFactory
                                        .newJMXConnectorServer(serviceUrl, environment, server);
                        server.registerMBean(new DiskStatusInquiry(),
                                        diskStatusInquiryMBeanName);
                        server.registerMBean(connector, connectorName);
                        connector.start();
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }
}


-------------------------------------------------------------------

5. JmxListener.java

package jmx;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class JmxListener implements ServletContextListener{
        public void contextInitialized (ServletContextEvent event) {
                new JmxAgent();
        }
       
        public void contextDestroyed (ServletContextEvent event) {}
}

-------------------------------------------------------------------

6. web.xml

<?xml version="1.0" encoding="euc-kr"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <servlet>
        <servlet-name>DiskStatus</servlet-name>
        <servlet-class>jmx.DiskStatus</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DiskStatus</servlet-name>
        <url-pattern>/DiskStatus</url-pattern>
    </servlet-mapping>

        <listener>
                <listener-class>
                jmx.JmxListener
                </listener-class>
        </listener>
</web-app> 

댓글 없음:

댓글 쓰기