日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

spring webflux配置成tomcat的線程池

作者:文盲青年 更新時間: 2023-09-12 編程語言

核心思想:Schedulers雖然提供了很多種線程調度的策略,但如果服務部署在tomcat中,那么直接使用tomcat的線程池即可,沒必要再另外創建線程,故采用Schedulers.immediate()策略。

通過分析源碼我們知道除了在過濾器WebFilter中調用subscribeOnpublishOn去切換線程池以外,spring webflux在啟動時,還有自動裝配,我們直接覆蓋自動裝配即可。

首先原生的自動裝配類為:

@AutoConfiguration(
    after = {ReactiveWebServerFactoryAutoConfiguration.class, CodecsAutoConfiguration.class, ReactiveMultipartAutoConfiguration.class, ValidationAutoConfiguration.class, WebSessionIdResolverAutoConfiguration.class}
)
@ConditionalOnWebApplication(
    type = Type.REACTIVE
)
@ConditionalOnClass({WebFluxConfigurer.class})
@ConditionalOnMissingBean({WebFluxConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
public class WebFluxAutoConfiguration {
    public WebFluxAutoConfiguration() {
    }

		//省略若干代碼

        @Bean
        @ConditionalOnMissingBean(
            name = {"webSessionManager"}
        )
        public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolver) {
            DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
            Duration timeout = this.serverProperties.getReactive().getSession().getTimeout();
            webSessionManager.setSessionStore(new WebFluxAutoConfiguration.MaxIdleTimeInMemoryWebSessionStore(timeout));
            webSessionIdResolver.ifAvailable(webSessionManager::setSessionIdResolver);
            return webSessionManager;
        }
       //省略若干代碼
}

那么這里我則可以自己寫一個裝配類:

@Configuration
public class CustomWebFluxAutoConfiguration {


    private final ServerProperties serverProperties;

    public CustomWebFluxAutoConfiguration(ServerProperties serverProperties) {
        this.serverProperties = serverProperties;
    }

    @Bean
    @ConditionalOnMissingBean(name = WebHttpHandlerBuilder.WEB_SESSION_MANAGER_BEAN_NAME)
    public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolver) {
        DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
        Duration timeout = this.serverProperties.getReactive().getSession().getTimeout();
        webSessionManager.setSessionStore(new MaxIdleTimeInMemoryWebSessionStore(timeout));
        webSessionIdResolver.ifAvailable(webSessionManager::setSessionIdResolver);
        return webSessionManager;
    }

    static final class MaxIdleTimeInMemoryWebSessionStore extends InMemoryWebSessionStore {

        private final Duration timeout;

        private MaxIdleTimeInMemoryWebSessionStore(Duration timeout) {
            this.timeout = timeout;
        }

        @NotNull
        @Override
        public Mono<WebSession> createWebSession() {
            return new WebSessionConfig().createWebSession().doOnSuccess(this::setMaxIdleTime);
        }

        private void setMaxIdleTime(WebSession session) {
            session.setMaxIdleTime(this.timeout);
        }

    }
}

WebSessionConfig類,我們重寫其createWebSession()方法,在里面指定線程策略,重寫其他方法就照抄框架已有InMemoryWebSessionStore()中的實現的即可。

public class WebSessionConfig implements WebSessionStore {
	//省略若干代碼
    @NotNull
    @Override
    public Mono<WebSession> createWebSession() {

        // Opportunity to clean expired sessions
        Instant now = this.clock.instant();
        this.expiredSessionChecker.checkIfNecessary(now);

        return Mono.<WebSession>fromSupplier(() -> new InMemoryWebSession(now))
                .subscribeOn(Schedulers.immediate())//核心代碼
                .publishOn(Schedulers.immediate());//核心代碼
    }
}
	//省略若干代碼

原文鏈接:https://rabbit.blog.csdn.net/article/details/131188113

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新