在 spring boot 2.0.0 中设置 jvmRoute
Set jvmRoute in spring boot 2.0.0
对于粘性会话,我需要设置嵌入式的 jvmRoute tomcat。
其实只有一个
System.setProperty("jvmRoute", "node1");
是必需的,但我想通过 application.properties 设置一个可配置的 属性。我不知道如何以及何时使用带注释的@Value 属性.
来设置它
如here所述使用@PostConstruct,它不起作用(至少在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);
});
}
我正在使用 Spring Boot 2.0.4。上面的答案一直对我不起作用。我不得不这样更新它:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
return (tomcat) -> {
tomcat.addContextCustomizers((context) -> {
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
context.setManager(manager);
}
((ManagerBase) context.getManager()).getEngine().setJvmRoute("tomcatJvmRoute");
});
};
}
对于粘性会话,我需要设置嵌入式的 jvmRoute tomcat。
其实只有一个
System.setProperty("jvmRoute", "node1");
是必需的,但我想通过 application.properties 设置一个可配置的 属性。我不知道如何以及何时使用带注释的@Value 属性.
来设置它如here所述使用@PostConstruct,它不起作用(至少在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);
});
}
我正在使用 Spring Boot 2.0.4。上面的答案一直对我不起作用。我不得不这样更新它:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
return (tomcat) -> {
tomcat.addContextCustomizers((context) -> {
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
context.setManager(manager);
}
((ManagerBase) context.getManager()).getEngine().setJvmRoute("tomcatJvmRoute");
});
};
}