在Spring Boot中的多个连接器之间共享嵌入式Tomcat执行器

在Spring Boot中的多个连接器之间共享嵌入式Tomcat执行器,tomcat,spring-boot,Tomcat,Spring Boot,我正在尝试使用SpringBoot和两个连接器(HTTP和HTTPS)以及两个连接器的共享执行器来设置嵌入式Tomcat 我已经在Spring Boot application.properties上配置了HTTPS连接器,然后按照中所述以编程方式添加了HTTP连接器 但是,我看不到对两个连接器使用相同执行器的任何选项。我想将这种设置转换为Spring Boot的配置: <Executor name="tomcatSharedThreadPool" namePrefix

我正在尝试使用SpringBoot和两个连接器(HTTP和HTTPS)以及两个连接器的共享执行器来设置嵌入式Tomcat

我已经在Spring Boot application.properties上配置了HTTPS连接器,然后按照中所述以编程方式添加了HTTP连接器

但是,我看不到对两个连接器使用相同执行器的任何选项。我想将这种设置转换为Spring Boot的配置:

<Executor name="tomcatSharedThreadPool" namePrefix="catalina-exec-" 
    maxThreads="150" minSpareThreads="4"/>

<Connector executor="tomcatSharedThreadPool"
           port="80" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="443" />
<Connector executor="tomcatSharedThreadPool"
           port="443" protocol="HTTP/1.1" 
           connectionTimeout="20000" />

有人知道怎么做吗


谢谢。

考虑一下我博客文章中经过改编的片段:


考虑一下我博客文章中的这段改编片段:


为了让执行器由Tomcat管理,您必须将自定义执行器添加到Tomcat服务中,以便将其集成到Tomcat生命周期中

要实现这一点,请使用TomcatEmbeddedServletContainerFactory的方法
addConnectorCustomizers
。然后,在连接器定制器中,您可以访问Tomcat服务,以便您的定制执行器可以添加到Tomcat生命周期并设置到每个连接器

public class MultipleConnectorCustomizer implements TomcatConnectorCustomizer {
@Override
public void customize(final Connector pConnector) {
    // Create shared Tomcat executor
    Service tomcatService = pConnector.getService();
    StandardThreadExecutor executor = createExecutor();
    tomcatService.addExecutor(executor);

    // Customize default connector (HTTPS created by the TomcatEmbeddedServletContainerFactory)
    ProtocolHandler handler = pConnector.getProtocolHandler();
    if (handler instanceof AbstractProtocol) {
        AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;
        protocol.setExecutor(executor);
    }

    // Create additional redirected HTTP connector
    Connector additionalConnector = new Connector(fTomcatProperties.getProtocol().getProtocol());
    additionalConnector.setPort(fTomcatProperties.getHttpRedirectedPort().intValue());
    additionalConnector.setRedirectPort(fServerProperties.getPort().intValue());
    ProtocolHandler additionalHandler = additionalConnector.getProtocolHandler();
    if (additionalHandler instanceof AbstractProtocol) {
        AbstractProtocol<?> protocol = (AbstractProtocol<?>) additionalHandler;
        protocol.setExecutor(executor);
    }

    tomcatService.addConnector(additionalConnector);
}
公共类MultipleConnectorCustomizer实现TomcatConnectorCustomizer{
@凌驾
公用连接器(最终连接器pConnector){
//创建共享Tomcat执行器
服务tomcatService=pConnector.getService();
StandardThreadExecutor executor=createExecutor();
tomcatService.addExecutor(执行器);
//自定义默认连接器(由TomcatEmbeddedServletContainerFactory创建的HTTPS)
ProtocolHandler=pConnector.getProtocolHandler();
if(抽象协议的处理程序实例){
AbstractProtocol=(AbstractProtocol)处理程序;
协议。setExecutor(executor);
}
//创建其他重定向HTTP连接器
连接器additionalConnector=新连接器(fTomcatProperties.getProtocol().getProtocol());
additionalConnector.setPort(fTomcatProperties.GetHttpRedectedPort().intValue());
additionalConnector.setRedirectPort(fsServerProperties.getPort().intValue());
ProtocolHandler additionalHandler=additionalConnector.getProtocolHandler();
if(AbstractProtocol的附加处理程序实例){
AbstractProtocol=(AbstractProtocol)additionalHandler;
协议。setExecutor(executor);
}
添加连接器(附加连接器);
}

为了让执行器由Tomcat管理,您必须将自定义执行器添加到Tomcat服务中,以便将其集成到Tomcat生命周期中

要实现这一点,请使用TomcatEmbeddedServletContainerFactory的方法
addConnectorCustomizers
。然后,在连接器定制器中,您可以访问Tomcat服务,以便可以将自定义执行器添加到Tomcat生命周期中并设置为每个连接器

public class MultipleConnectorCustomizer implements TomcatConnectorCustomizer {
@Override
public void customize(final Connector pConnector) {
    // Create shared Tomcat executor
    Service tomcatService = pConnector.getService();
    StandardThreadExecutor executor = createExecutor();
    tomcatService.addExecutor(executor);

    // Customize default connector (HTTPS created by the TomcatEmbeddedServletContainerFactory)
    ProtocolHandler handler = pConnector.getProtocolHandler();
    if (handler instanceof AbstractProtocol) {
        AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;
        protocol.setExecutor(executor);
    }

    // Create additional redirected HTTP connector
    Connector additionalConnector = new Connector(fTomcatProperties.getProtocol().getProtocol());
    additionalConnector.setPort(fTomcatProperties.getHttpRedirectedPort().intValue());
    additionalConnector.setRedirectPort(fServerProperties.getPort().intValue());
    ProtocolHandler additionalHandler = additionalConnector.getProtocolHandler();
    if (additionalHandler instanceof AbstractProtocol) {
        AbstractProtocol<?> protocol = (AbstractProtocol<?>) additionalHandler;
        protocol.setExecutor(executor);
    }

    tomcatService.addConnector(additionalConnector);
}
公共类MultipleConnectorCustomizer实现TomcatConnectorCustomizer{
@凌驾
公用连接器(最终连接器pConnector){
//创建共享Tomcat执行器
服务tomcatService=pConnector.getService();
StandardThreadExecutor executor=createExecutor();
tomcatService.addExecutor(执行器);
//自定义默认连接器(由TomcatEmbeddedServletContainerFactory创建的HTTPS)
ProtocolHandler=pConnector.getProtocolHandler();
if(抽象协议的处理程序实例){
AbstractProtocol=(AbstractProtocol)处理程序;
协议。setExecutor(executor);
}
//创建其他重定向HTTP连接器
连接器additionalConnector=新连接器(fTomcatProperties.getProtocol().getProtocol());
additionalConnector.setPort(fTomcatProperties.GetHttpRedectedPort().intValue());
additionalConnector.setRedirectPort(fsServerProperties.getPort().intValue());
ProtocolHandler additionalHandler=additionalConnector.getProtocolHandler();
if(AbstractProtocol的附加处理程序实例){
AbstractProtocol=(AbstractProtocol)additionalHandler;
协议。setExecutor(executor);
}
添加连接器(附加连接器);
}

谢谢你的帮助,我刚刚完成了你的答案。如果你认为我的答案有助于你回答你的问题,你会考虑把它标记为“答案”吗?谢谢你的帮助,我刚刚完成了你的答案。如果你认为我的答案有助于你回答你的问题,你会考虑把它标记为“答案”吗??尽管这个问题较老,但有一个重复的问题,标题更好=更容易找到…可能的重复即使这个问题较老,也有一个重复的问题,标题更好=更容易找到…可能的重复
public class MultipleConnectorCustomizer implements TomcatConnectorCustomizer {
@Override
public void customize(final Connector pConnector) {
    // Create shared Tomcat executor
    Service tomcatService = pConnector.getService();
    StandardThreadExecutor executor = createExecutor();
    tomcatService.addExecutor(executor);

    // Customize default connector (HTTPS created by the TomcatEmbeddedServletContainerFactory)
    ProtocolHandler handler = pConnector.getProtocolHandler();
    if (handler instanceof AbstractProtocol) {
        AbstractProtocol<?> protocol = (AbstractProtocol<?>) handler;
        protocol.setExecutor(executor);
    }

    // Create additional redirected HTTP connector
    Connector additionalConnector = new Connector(fTomcatProperties.getProtocol().getProtocol());
    additionalConnector.setPort(fTomcatProperties.getHttpRedirectedPort().intValue());
    additionalConnector.setRedirectPort(fServerProperties.getPort().intValue());
    ProtocolHandler additionalHandler = additionalConnector.getProtocolHandler();
    if (additionalHandler instanceof AbstractProtocol) {
        AbstractProtocol<?> protocol = (AbstractProtocol<?>) additionalHandler;
        protocol.setExecutor(executor);
    }

    tomcatService.addConnector(additionalConnector);
}