FileDocCategorySizeDatePackage
JkMX.javaAPI DocApache Tomcat 6.0.1414166Fri Jul 20 04:20:34 BST 2007org.apache.jk.common

JkMX

public class JkMX extends org.apache.jk.core.JkHandler
Load the HTTP or RMI adapters for MX4J and JMXRI. Add "mx.enabled=true" in jk2.properties to enable it. You could also select http and/or jrmp protocol, with mx.httpPort, mx.httpHost, mxjrmpPort and mx.jrmpPort.

If you run into an error message like "SystemId Unknown; Line #12; Column #81; Cannot add attribute name after child nodes or before an element is produced. Attribute will be ignored." after setting mx.enabled to true, you probably need a newer version of Xalan. See the RELEASE-NOTES document section on XML Parsers for more information.

Fields Summary
MBeanServer
mserver
private boolean
enabled
private boolean
log4jEnabled
private int
httpport
private String
httphost
private String
authmode
private String
authuser
private String
authpassword
private int
jrmpport
private String
jrmphost
private boolean
useXSLTProcessor
ObjectName
httpServerName
ObjectName
jrmpServerName
private static org.apache.juli.logging.Log
log
Constructors Summary
public JkMX()


      
    
Methods Summary
public voidaddHandlerCallback(org.apache.jk.core.JkHandler w)

    
private static booleanclassExists(java.lang.String className)

        try {
            Thread.currentThread().getContextClassLoader().loadClass(className);
            return true;
        } catch(Throwable e) {
            if (log.isInfoEnabled())
                log.info( "className [" + className + "] does not exist");
            return false;
        }
    
public voiddestroy()

        try {
            if(log.isInfoEnabled())
                log.info("Stoping JMX ");

            if( httpServerName!=null ) {
                mserver.invoke(httpServerName, "stop", null, null);
            }
            if( jrmpServerName!=null ) {
                mserver.invoke(jrmpServerName, "stop", null, null);
            }
        } catch( Throwable t ) {
            log.error( "Destroy error" + t );
        }
    
public java.lang.StringgetAuthMode()

        return authmode;
    
public java.lang.StringgetAuthPassword()

        return authpassword;
    
public java.lang.StringgetAuthUser()

        return authuser;
    
public booleangetEnabled()

        return enabled;
    
public java.lang.StringgetHttpHost()

        return httphost;
    
public intgetHttpPort()

        return httpport;
    
public java.lang.StringgetJrmpHost()

        return jrmphost;
    
public intgetJrmpPort()

        return jrmpport;
    
public booleangetLog4jEnabled()

        return log4jEnabled;
    
javax.management.MBeanServergetMBeanServer()

        MBeanServer server;
        if( MBeanServerFactory.findMBeanServer(null).size() > 0 ) {
            server=(MBeanServer)MBeanServerFactory.findMBeanServer(null).get(0);
        } else {
            server=MBeanServerFactory.createMBeanServer();
        }
        return (server);
    
public intgetPort()

        return ((httpport != -1) ? httpport : jrmpport);
    
public booleangetUseXSLTProcessor()

        return useXSLTProcessor;
    
public voidinit()

        try {
            mserver = getMBeanServer();

            if( enabled ) {
                loadAdapter();
            }
            if( log4jEnabled) {
                try {
                    registerObject("org.apache.log4j.jmx.HierarchyDynamicMBean" ,
                                   "log4j:hierarchy=default");
                    if(log.isInfoEnabled())
                         log.info("Registering the JMX hierarchy for Log4J ");
                } catch( Throwable t ) {
                    if(log.isInfoEnabled())
                        log.info("Can't enable log4j mx: ",t);
                }
            }
        } catch( Throwable t ) {
            log.error( "Init error", t );
        }
    
public voidloadAdapter()
Initialize the worker. After this call the worker will be ready to accept new requests.


                         
         
        boolean httpAdapterLoaded = false;
        boolean jrmpAdapterLoaded = false;
        
        if ((httpport != -1) && classExists("mx4j.adaptor.http.HttpAdaptor")) {
            try {
                httpServerName = registerObject("mx4j.adaptor.http.HttpAdaptor",
                                                "Http:name=HttpAdaptor");

                        
                if( httphost!=null )
                    mserver.setAttribute(httpServerName, new Attribute("Host", httphost));
                mserver.setAttribute(httpServerName, new Attribute("Port", new Integer(httpport)));

                if( "none".equals(authmode) || "basic".equals(authmode) || "digest".equals(authmode) )
                    mserver.setAttribute(httpServerName, new Attribute("AuthenticationMethod", authmode));

                if( authuser!=null && authpassword!=null )
                    mserver.invoke(httpServerName, "addAuthorization",
                        new Object[] {
                            authuser,
                            authpassword},
                        new String[] { "java.lang.String", "java.lang.String" });

                if(useXSLTProcessor) {
                    ObjectName processorName = registerObject("mx4j.adaptor.http.XSLTProcessor",
                                                          "Http:name=XSLTProcessor");
                    mserver.setAttribute(httpServerName, new Attribute("ProcessorName", processorName));
                }

                // starts the server
                mserver.invoke(httpServerName, "start", null, null);

                log.info( "Started MX4J console on host " + httphost + " at port " + httpport);
                
                httpAdapterLoaded = true;

            } catch( Throwable t ) {
                httpServerName=null;
                log.error( "Can't load the MX4J http adapter ", t );
            }
        }

        if ((httpport != -1) && (!httpAdapterLoaded) && classExists("mx4j.tools.adaptor.http.HttpAdaptor")) {
            try {
                httpServerName = registerObject("mx4j.tools.adaptor.http.HttpAdaptor",
                                                "Http:name=HttpAdaptor");

                        
                if( httphost!=null )
                    mserver.setAttribute(httpServerName, new Attribute("Host", httphost));
                mserver.setAttribute(httpServerName, new Attribute("Port", new Integer(httpport)));

                if( "none".equals(authmode) || "basic".equals(authmode) || "digest".equals(authmode) )
                    mserver.setAttribute(httpServerName, new Attribute("AuthenticationMethod", authmode));

                if( authuser!=null && authpassword!=null )
                    mserver.invoke(httpServerName, "addAuthorization",
                        new Object[] {
                            authuser,
                            authpassword},
                        new String[] { "java.lang.String", "java.lang.String" });

               if(useXSLTProcessor) {
                    ObjectName processorName = registerObject("mx4j.tools.adaptor.http.XSLTProcessor",
                                                          "Http:name=XSLTProcessor");
                    mserver.setAttribute(httpServerName, new Attribute("ProcessorName", processorName));
		}
                // starts the server
                mserver.invoke(httpServerName, "start", null, null);
                if(log.isInfoEnabled())
                    log.info( "Started MX4J console on host " + httphost + " at port " + httpport);
                
                httpAdapterLoaded = true;

            } catch( Throwable t ) {
                httpServerName=null;
                log.error( "Can't load the MX4J http adapter ", t );
            }
        }

        if ((jrmpport != -1) && classExists("mx4j.tools.naming.NamingService")) {
            try {
                jrmpServerName = registerObject("mx4j.tools.naming.NamingService",
                                                "Naming:name=rmiregistry");
				mserver.setAttribute(jrmpServerName, new Attribute("Port", 
				                                     new Integer(jrmpport)));
                mserver.invoke(jrmpServerName, "start", null, null);
                if(log.isInfoEnabled())
                    log.info( "Creating " + jrmpServerName );

                // Create the JRMP adaptor
                ObjectName adaptor = registerObject("mx4j.adaptor.rmi.jrmp.JRMPAdaptor",
                                                    "Adaptor:protocol=jrmp");


                mserver.setAttribute(adaptor, new Attribute("JNDIName", "jrmp"));

                mserver.invoke( adaptor, "putNamingProperty",
                        new Object[] {
                            javax.naming.Context.INITIAL_CONTEXT_FACTORY,
                            "com.sun.jndi.rmi.registry.RegistryContextFactory"},
                        new String[] { "java.lang.Object", "java.lang.Object" });

                String jrpmurl = "rmi://" + jrmphost + ":" + Integer.toString(jrmpport) ;
                                        
                mserver.invoke( adaptor, "putNamingProperty",
                        new Object[] {
                            javax.naming.Context.PROVIDER_URL,
                            jrpmurl},
                        new String[] { "java.lang.Object", "java.lang.Object" });

                // Registers the JRMP adaptor in JNDI and starts it
                mserver.invoke(adaptor, "start", null, null);
                if(log.isInfoEnabled())
                    log.info( "Creating " + adaptor + " on host " + jrmphost + " at port " + jrmpport);

                jrmpAdapterLoaded = true;

            } catch( Exception ex ) {
                jrmpServerName = null;
                log.error( "MX4j RMI adapter not loaded: " + ex.toString());
            }
        }

        if ((httpport != -1) && (! httpAdapterLoaded) && classExists("com.sun.jdmk.comm.HtmlAdaptorServer")) {
            try {
                httpServerName=registerObject("com.sun.jdmk.comm.HtmlAdaptorServer",
                                              "Adaptor:name=html,port=" + httpport);
                if(log.isInfoEnabled())
                    log.info("Registering the JMX_RI html adapter " + httpServerName + " at port " + httpport);

                mserver.setAttribute(httpServerName,
                                     new Attribute("Port", new Integer(httpport)));

                mserver.invoke(httpServerName, "start", null, null);

                httpAdapterLoaded = true;
            } catch( Throwable t ) {
                httpServerName = null;
                log.error( "Can't load the JMX_RI http adapter " + t.toString()  );
            }
        }

        if ((!httpAdapterLoaded) && (!jrmpAdapterLoaded))
            log.warn( "No adaptors were loaded but mx.enabled was defined.");

    
private javax.management.ObjectNameregisterObject(java.lang.String className, java.lang.String oName)

        Class c = Class.forName(className);
        Object o = c.newInstance();
        ObjectName objN = new ObjectName(oName);
        mserver.registerMBean(o, objN);
        return objN;
    
public voidsetAuthMode(java.lang.String mode)

        authmode=mode;
    
public voidsetAuthPassword(java.lang.String password)

        authpassword=password;
    
public voidsetAuthUser(java.lang.String user)

        authuser=user;
    
public voidsetEnabled(boolean b)
Enable the MX4J adapters (new way)

        enabled=b;
    
public voidsetHttpHost(java.lang.String host)

        this.httphost=host;
    
public voidsetHttpPort(int i)
Enable the MX4J HTTP internal adapter

        httpport=i;
    
public voidsetJrmpHost(java.lang.String host)

        this.jrmphost=host;
    
public voidsetJrmpPort(int i)
Enable the MX4J JRMP internal adapter

        jrmpport=i;
    
public voidsetLog4jEnabled(boolean b)
Enable the Log4j MBean)

        log4jEnabled=b;
    
public voidsetPort(int i)
Enable the MX4J adapters (old way, compatible)

        enabled=(i != -1);
    
public voidsetUseXSLTProcessor(boolean uxsltp)

        useXSLTProcessor = uxsltp;