【问题标题】:Mod_Cluster LifecycleListeners Spring BootMod_Cluster LifecycleListeners Spring Boot
【发布时间】:2023-06-05 10:59:01
【问题描述】:

我正在将我的项目 Spring 迁移到 Spring Boot。但是我遇到了一个问题,我们有一个使用 apache2 和 mod_cluster 的反向代理。在实际版本中,我们在 server.xml 中声明了一个 Listerner。

<Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="false" proxyList="${proxyList}" />

我把它当作一个 Spring Boot 应用程序。

private Connector ajpConnector() {
    Connector connector = new Connector("AJP/1.3");
    connector.setPort(8009);
    connector.setRedirectPort(8443);
    return connector;
}


private ModClusterListener modCluster() {
    ModClusterListener modClusterListener = new ModClusterListener();
    modClusterListener.setAdvertise(false);
    modClusterListener.setProxyURL(proxyUrl);

    return modClusterListener;
}

@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
    return server -> {
        if (server != null) {
            server.addContextLifecycleListeners(modCluster());
            server.addAdditionalTomcatConnectors(ajpConnector());
        }
    };
}

但它不起作用,ModClusterListener 想要一个 Sever 类型的 LifecycleEvent,但它永远不会发生。谁能帮帮我?

【问题讨论】:

    标签: java spring spring-boot tomcat9 mod-cluster


    【解决方案1】:

    我在 Gitter 上发布了这个问题,Andy Wilkinson 帮助了我。

    “从您所说的来看,听起来 ModClusterListener 需要添加到 Tomcat 的服务器中,但是您使用的方法会将其添加到上下文中。您可以使用上下文定制器并从上下文向上导航,直到您找到服务器,或者您可以使用 TomcatServletWebServerFactory 子类:"

    @Bean
    public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
    
            @Override
            protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
                tomcat.getServer().addLifecycleListener(modCluster());
                return new TomcatWebServer(tomcat);
            }
    
        };
    }
    

    它对我有用!

    【讨论】:

    • 我的github repository 上有一个工作样本。请随时查看以获取补充信息。