Установите jvmRoute в весеннюю загрузку 2.0.0
Для липкой сессии мне нужно установить jvmRoute встроенного кота.
На самом деле только
System.setProperty("jvmRoute", "node1");
требуется, но я хочу установить настраиваемое свойство via application.properties. Я не знаю, как и когда установить это с аннотированным свойством @Value.
С @PostConstruct, как описано здесь, он не работает (по крайней мере, при весенней загрузке 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);
}
}
}
Это работает, но выглядит не очень элегантно...
Любые предложения очень ценятся.
2 ответа
Решение
Вы можете настроить Tomcat Context
немного более элегантно, используя контекстную настройку. Это функциональный интерфейс, поэтому вы можете использовать лямбду:
@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");
});
};
}