对于粘性会话,我需要设置嵌入式 tomcat 的 jvmRoute。
其实只是一个
System.setProperty("jvmRoute", "node1");
是必需的,但我想设置一个 via application.properties 可配置属性。我不知道如何以及何时使用 @Value 带注释的属性来设置它。
使用 @PostConstruct 描述的here https://stackoverflow.com/questions/31166336/how-to-set-embedded-tomcat-jvmroute,它不起作用(至少在 Spring Boot 2.0.0.RELEASE 中不起作用)
到目前为止我发现的唯一方法是
@Component
public class TomcatInitializer implements ApplicationListener<ServletWebServerInitializedEvent> {
@Value("${tomcat.jvmroute}")
private String jvmRoute;
@Override
public void onApplicationEvent(final ServletWebServerInitializedEvent event) {
final WebServer ws = event.getApplicationContext().getWebServer();
if (ws instanceof TomcatWebServer) {
final TomcatWebServer tws = (TomcatWebServer) ws;
final Context context = (Context) tws.getTomcat().getHost().findChildren()[0];
context.getManager().getSessionIdGenerator().setJvmRoute(jvmRoute);
}
}
}
它可以工作,但看起来不太优雅......
非常感谢任何建议。
可以自定义Tomcat的Context
通过使用上下文定制器可以更优雅一些。它是一个函数式接口,因此您可以使用 lambda:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return (tomcat) -> tomcat.addContextCustomizers((context) -> {
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
context.setManager(manager);
}
manager.getSessionIdGenerator().setJvmRoute(jvmRoute);
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)