Установите 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");

        });
    };
}
Другие вопросы по тегам