All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.patterncat.metrics.config.TomcatCustomizer Maven / Gradle / Ivy

The newest version!
package cn.patterncat.metrics.config;

import org.apache.catalina.connector.Connector;
import org.apache.commons.lang3.StringUtils;
import org.apache.coyote.ProtocolHandler;
import org.apache.coyote.http11.Http11NioProtocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by patterncat on 2017-01-04.
 */
public class TomcatCustomizer implements EmbeddedServletContainerCustomizer {

    private static final Logger LOGGER = LoggerFactory.getLogger(TomcatCustomizer.class);

    private Map attributes = new HashMap<>();

    AdvancedThreadExecutor advancedThreadExecutor;

    public TomcatCustomizer(AdvancedThreadExecutor advancedThreadExecutor) {
        this.advancedThreadExecutor = advancedThreadExecutor;
    }

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        if(container instanceof TomcatEmbeddedServletContainerFactory){
            TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory)container;
            factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    connector.getService().addExecutor(advancedThreadExecutor);
                    ProtocolHandler handler = connector.getProtocolHandler();
//                    logger.info("handler:{}",handler.getClass().getName());
//                    connector.setAttribute("maxThreads",400);
//                    connector.setAttribute("acceptCount",400);

                    LOGGER.info("====== tomcat protocol config start ======");
                    boolean http11 = handler instanceof Http11NioProtocol;
                    if(!http11){
                        return ;
                    }
                    Http11NioProtocol http11NioProtocol = (Http11NioProtocol)handler;
                    http11NioProtocol.setExecutor(advancedThreadExecutor);
                    Method[] methods = Http11NioProtocol.class.getMethods();
                    for(Method m:methods){
                        if(!m.getName().startsWith("get")){
                            continue;
                        }
//                            if("getSslEnabledProtocols".equals(m.getName()) || "getSSLProtocol".equals(m.getName())){
//                                //defaultSSLHostConfig.getEnabledProtocols() = null
//                                // StringUtils.join(this.defaultSSLHostConfig.getEnabledProtocols());
//                                continue;
//                            }
                        Class methodParams[] = m.getParameterTypes();
                        if(methodParams == null || methodParams.length == 0){
                            Object value = null;
                            try {
                                value = m.invoke(http11NioProtocol);
                            } catch (Exception e) {
                                LOGGER.warn("invoke http11NioProtocol method:{},error:{}",m.toString(),e.getMessage());
                            }
                            String prop = StringUtils.uncapitalize(m.getName().substring(3));
                            LOGGER.info("property:{} value:{}",prop,value);
                            attributes.put(prop,value);
                        }
                    }
                    LOGGER.info("====== tomcat protocol config end ======");
                }
            });
        }
    }

    public Map getAttributes() {
        return attributes;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy