在Java代码中访问server.xml的已配置连接器标记

时间:2016-12-28 05:13:20

标签: java tomcat7 connector server.xml

我在server.xml中配置了连接器标记,如下所示。

var testApp= angular.module('test');

我想在运行时使用java代码读取 bindOnInit 参数的值。 我不想解析xml。 当我搜索时,我发现我可以从 Tomcat tomcat =新的Tomcat(); tomcat对象获取数据。如何获取现有的tomcat对象而不是创建新的tomcat对象,因为创建新的tomcat对象不会给我配置的值。

请使用java代码帮助您在运行时阅读 bindOnInit 参数。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您必须使用MBeanServer恢复org.apache.catalina.server.StandardServer。这是所有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

您可以看到可以通过Connector的binOnInitgetProperty()方法访问getAttribute()属性,并且它实际上返回了AJP连接器的false值:

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