Доступ к тегу настроенного соединителя сервера.xml в коде Java

У меня есть тег соединителя, настроенный на сервере.xml как показано ниже.

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

Я хочу прочитать значение параметра bindOnInit во время выполнения с помощью кода java.
Я не хочу разбирать xml.
При поиске я обнаружил, что могу получить данные из Tomcat tomcat = new Tomcat(); tomcat object. Как я могу получить существующий объект tomcat вместо создания нового, потому что создание нового объекта tomcat не даст мне настроенное значение.

Пожалуйста, помогите в чтении параметра bindOnInit во время выполнения с помощью кода java.

Заранее спасибо.

1 ответ

  1. Необходимо восстановить org.apache.catalina.server.StandardServerMBeanServer. Это корневая запись для всех системных элементов Tomcat:

    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;
        }
    }
    

    Я протестировал эту конфигурацию соединителя:

      <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"/>
    
        ...
    

    И это выход журнала:

    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
    

    Вы видите, что к binOnInitсвойству можно получить доступ с помощью getProperty()getAttribute()методов или соединителя и что оно фактически возвращает falseзначение для соединителя AJP:

    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