Accessing configured Connector tag of server.xml in Java code

1.9k views Asked by At

I have connector tag configured in server.xml as below.

<Connector port="8080" bindOnInit="false" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

I want to read value of bindOnInit parameter at runtime using java code. I do not want to parse the xml. As i searched i found that i can get data from Tomcat tomcat = new Tomcat(); tomcat object. How can i get existing tomcat object instead of creating new one because creating new tomcat object will not give me configured value.

Please help in reading bindOnInit parameter at Runtime using java code.

Thank you in advance.

1

There are 1 answers

0
jlumietu On

You must recover the org.apache.catalina.server.StandardServer using MBeanServer. This is the root entry for all Tomcat system elements:

import java.lang.management.ManagementFactory;
import java.util.Collection;
import java.util.HashSet;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardServer;
import org.apache.log4j.Logger;

public class TomcatConnectors {

    public static final String CATALINA_SERVICE_NAME = "Catalina";

    public static final String CONNECTOR_HTTP_PROTOCOL_NAME = "HTTP/1.1"; 

    private Logger logger = Logger.getLogger(this.getClass());

    private Collection<Connector> connectors;

    /**
     * 
     */
    public TomcatConnectors() {
        super();
        this.connectors = new HashSet<Connector>();
        this.loadConnectors();
    }

    /**
     * 
     * @return
     */
    protected StandardServer getServerInstance(){
        org.apache.catalina.core.StandardServer server = null; 
        try{
            MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
            server = (StandardServer)mbeanServer.getAttribute(
                        new ObjectName("Catalina:type=Server"),
                        "managedResource"
                    );
            if(logger.isDebugEnabled()){
                logger.debug("Server found. Info: ");
                logger.debug(" - address          : " + server.getAddress());
                logger.debug(" - domain           : " + server.getDomain());
                logger.debug(" - info             : " + server.getInfo());
                logger.debug(" - shutdown port    : " + server.getPort());
                logger.debug(" - shutdown command : " + server.getShutdown());
                logger.debug(" - serverInfo       : " + server.getServerInfo());
                logger.debug(" - status           : " + server.getStateName());

            }               

        }catch(Throwable t){
            logger.fatal("Fatal Error Recovering StandardServer from MBeanServer : " + t.getClass().getName() + ": " + t.getMessage(), t);
        }
        return server;
    }

    /*
     * 
     */
    protected Service getCatalinaService(){
        org.apache.catalina.core.StandardServer server = this.getServerInstance();
        Service[] services = server.findServices();
        for(Service aService : services){
            if(logger.isDebugEnabled()){
                logger.debug("Service: " + aService.getName() + 
                        ", info: " + aService.getInfo() + 
                        ", state: " + aService.getStateName());
            }

            if(aService.getName().equalsIgnoreCase(CATALINA_SERVICE_NAME)){
                return aService;                
            }
        }
        return null;
    }

    protected void loadConnectors() {
        Service catalinaService = this.getCatalinaService();
        if(catalinaService == null){
            throw new IllegalStateException("Service Catalina cannot be null");
        }
        if(catalinaService.findConnectors() != null && catalinaService.findConnectors().length > 0){
            logger.debug("List of connectors: ");
            for(Connector aConnector : catalinaService.findConnectors()){
                if(logger.isDebugEnabled()){
                    logger.debug("Connector.getProtocol: " + aConnector.getProtocol());
                    logger.debug("Connector.getPort: " + aConnector.getPort());
                    logger.debug("Connector.getInfo: " + aConnector.getInfo());
                    logger.debug("Connector.getStateName: " + aConnector.getStateName());
                    logger.debug("Connector.property.bindOnInit: " + aConnector.getProperty("bindOnInit"));
                    logger.debug("Connector.attribute.bindOnInit: " + aConnector.getAttribute("bindOnInit"));
                    logger.debug("Connector.getState: " + aConnector.getState());
                }
                this.connectors.add(aConnector);
            }
        }
    }

    /**
     * @return the connectors
     */
    public Collection<Connector> getConnectors() {
        if(this.connectors.isEmpty()){
            this.loadConnectors();
        }
        return connectors;
    }
}

I've tested with this connector configuration:

  <Service name="Catalina">

    <Connector connectionTimeout="20000" port="8787" protocol="HTTP/1.1" redirectPort="8443"/>

    <Connector bindOnInit="false" port="8009" protocol="AJP/1.3" redirectPort="8443"/>

    ...

And this is the log output:

HH:mm:ss,046 DEBUG  TomcatConnectors:46 - Server found. Info: 
HH:mm:ss,046 DEBUG  TomcatConnectors:47 -  - address          : localhost
HH:mm:ss,046 DEBUG  TomcatConnectors:48 -  - domain           : Catalina
HH:mm:ss,046 DEBUG  TomcatConnectors:49 -  - info             : org.apache.catalina.core.StandardServer/1.0
HH:mm:ss,046 DEBUG  TomcatConnectors:50 -  - shutdown port    : 8005
HH:mm:ss,046 DEBUG  TomcatConnectors:51 -  - shutdown command : SHUTDOWN
HH:mm:ss,046 DEBUG  TomcatConnectors:52 -  - serverInfo       : Apache Tomcat/7.0.29
HH:mm:ss,046 DEBUG  TomcatConnectors:53 -  - status           : STARTING
HH:mm:ss,047 DEBUG  TomcatConnectors:71 - Service: Catalina, info: org.apache.catalina.core.StandardService/1.0, state: STARTING
HH:mm:ss,047 DEBUG  TomcatConnectors:89 - List of connectors: 
HH:mm:ss,047 DEBUG  TomcatConnectors:92 - Connector.getProtocol: HTTP/1.1
HH:mm:ss,047 DEBUG  TomcatConnectors:93 - Connector.getPort: 8787
HH:mm:ss,047 DEBUG  TomcatConnectors:94 - Connector.getInfo: org.apache.catalina.connector.Connector/2.1
HH:mm:ss,047 DEBUG  TomcatConnectors:95 - Connector.getStateName: INITIALIZED
HH:mm:ss,047 DEBUG  TomcatConnectors:96 - Connector.property.bindOnInit: null
HH:mm:ss,047 DEBUG  TomcatConnectors:97 - Connector.attribute.bindOnInit: null
HH:mm:ss,047 DEBUG  TomcatConnectors:98 - Connector.getState: INITIALIZED
HH:mm:ss,048 DEBUG  TomcatConnectors:92 - Connector.getProtocol: AJP/1.3
HH:mm:ss,048 DEBUG  TomcatConnectors:93 - Connector.getPort: 8009
HH:mm:ss,048 DEBUG  TomcatConnectors:94 - Connector.getInfo: org.apache.catalina.connector.Connector/2.1
HH:mm:ss,048 DEBUG  TomcatConnectors:95 - Connector.getStateName: INITIALIZED
HH:mm:ss,048 DEBUG  TomcatConnectors:96 - Connector.property.bindOnInit: false
HH:mm:ss,048 DEBUG  TomcatConnectors:97 - Connector.attribute.bindOnInit: false
HH:mm:ss,048 DEBUG  TomcatConnectors:98 - Connector.getState: INITIALIZED

You can see that the binOnInit property can be accessed through the getProperty() or getAttribute() methods of the Connector, and that it actually returns the false value for AJP connector:

HH:mm:ss,048 DEBUG  TomcatConnectors:92 - Connector.getProtocol: AJP/1.3
HH:mm:ss,048 DEBUG  TomcatConnectors:96 - Connector.property.bindOnInit: false
HH:mm:ss,048 DEBUG  TomcatConnectors:97 - Connector.attribute.bindOnInit: false