[spring-projects/spring-boot]提供自定义Tomcat的ProtocolHandler的回调

2024-04-10 575 views
3

引入新的回调接口 TomcatProtocolHandlerCustomizer,可用于自定义 Tomcat 连接器上的 ProtocolHandler。

修复#15035

回答

7

@pas2al 感谢您的公关。我可能遗漏了一些东西,但我没有看到新的定制器在TomcatServletWebServerFactory和中的任何地方使用TomcatReactiveWebServerFactory。例如,这里TomcatConnectorCustomizer使用 s 。

2

你能详细说明一下吗?

2

一旦在和tomcatProtocolHandlerCustomizers上设置了,就需要为每一个调用。该测试目前将失败,因为连接器的协议处理程序不会调用自定义:TomcatServletWebServerFactoryTomcatReactiveWebServerFactorycustomize

TomcatServletWebServerFactory factory = getFactory();
factory.addProtocolHandlerCustomizers(
        (TomcatProtocolHandlerCustomizer) protocolHandler -> protocolHandler.setThreadPriority(23));
Tomcat tomcat = getTomcat(factory);
Connector connector = ((TomcatWebServer) this.webServer).getServiceConnectors()
        .get(tomcat.getService())[0];
AbstractProtocol protocolHandler = (AbstractProtocol) connector.getProtocolHandler();
assertThat(protocolHandler.getThreadPriority()).isEqualTo(23);
7

@mbhave 好的,这是有道理的。我错过了,抱歉!那么我应该这样称呼customize每个人吗?ProtocolHandlerCustomizer

for (TomcatProtocolHandlerCustomizer customizer : this.tomcatProtocolHandlerCustomizers) {
    customizer.customize((AbstractProtocol<?>) connector.getProtocolHandler());
}

该方法是执行此操作的好地方吗customizeConnector(您将其固定在上面的评论中)?

我就这样尝试了一下,并通过测试证实了这一点。我只是想澄清我走在正确的轨道上。

8

@pas2al 是的,customizeConnector将是一个很好的地方。我也不认为我们需要强迫定制者采取AbstractProtocol.我们可以只自TomcatProtocolHandlerCustomizer定义 a ProtocolHandler。它看起来像这样:

void customize(ProtocolHandler protocolHandler);
9

好的,感谢您的反馈!关于ProtocolHandler.在#15035中,描述建议将其定制为如下所示:

@Bean
public TomcatProtocolHandlerCustomizer<AbstractHttp11Protocol<?>> processorCacheCustomizer() {
    return (handler) -> handler.setProcessorCache(250);
}

因此,将类型传递给TomcatProtocolHandlerCustomizer仍然是可行的方法,还是我们自定义一个ProtocolHandler?但是上面的 Bean 示例将不起作用。

8

抱歉,你是对的。我的意思是我们可以更改通用以期望ProtocolHandler.

public interface TomcatProtocolHandlerCustomizer<T extends ProtocolHandler> {

这样我们就不需要AbstractProtocol在调用时将其转换为 an customize

0

TomcatProtocolHandlerCustomizer好的,我应该输入这样的用法<TomcatProtocolHandlerCustomizer<ProtocolHandler>>吗?例如,对于 中的用法TomcatServletWebServerFactory,或者您还有其他建议吗?

5

我更新了 PR。

2

@pas2al 感谢您对 Spring Boot 做出的第一个贡献。现在它与这个波兰提交一起合并到 master 中。

3

@mbhave 非常感谢您的机会和支持!