最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決Spring session(redis存儲(chǔ)方式)監(jiān)聽導(dǎo)致創(chuàng)建大量redisMessageListenerContailner-X線程問題

 更新時(shí)間:2018年08月31日 14:30:25   作者:aoeiuv  
這篇文章主要介紹了解決Spring session(redis存儲(chǔ)方式)監(jiān)聽導(dǎo)致創(chuàng)建大量redisMessageListenerContailner-X線程問題,需要的朋友可以參考下

待解決的問題

Spring session(redis存儲(chǔ)方式)監(jiān)聽導(dǎo)致創(chuàng)建大量redisMessageListenerContailner-X線程

解決辦法

為spring session添加springSessionRedisTaskExecutor線程池。

/**
 * 用于spring session,防止每次創(chuàng)建一個(gè)線程
 * @return
 */
@Bean
public ThreadPoolTaskExecutor springSessionRedisTaskExecutor(){
  ThreadPoolTaskExecutor springSessionRedisTaskExecutor = new ThreadPoolTaskExecutor();
  springSessionRedisTaskExecutor.setCorePoolSize(8);
  springSessionRedisTaskExecutor.setMaxPoolSize(16);
  springSessionRedisTaskExecutor.setKeepAliveSeconds(10);
  springSessionRedisTaskExecutor.setQueueCapacity(1000);
  springSessionRedisTaskExecutor.setThreadNamePrefix("Spring session redis executor thread: ");
  return springSessionRedisTaskExecutor;
}

原因

在Spring Session(redis)的配置類源碼中(RedisHttpSessionConfiguration):

@Autowired(
  required = false  //該處理監(jiān)聽的線程池不是必須的,如果不自定義默認(rèn)將使用SimpleAsyncTaskExecutor線程池
)
@Qualifier("springSessionRedisTaskExecutor")
public void setRedisTaskExecutor(Executor redisTaskExecutor) {
  this.redisTaskExecutor = redisTaskExecutor;
}

springSessionRedisTaskExecutor不是必須的,如果不自定義則spring默認(rèn)將使用SimpleAsyncTaskExecutor線程池。

題外話

SimpleAsyncTaskExecutor:每次都將創(chuàng)建新的線程(說是“線程池”,其實(shí)并非真正的池化,但它可以設(shè)置最大并發(fā)線程數(shù)量。)

@EnableAsync開啟異步方法,背后默認(rèn)使用的就是這個(gè)線程池。使用異步方法時(shí)如果業(yè)務(wù)場景存在頻繁的調(diào)用(該異步方法),請自定義線程池,以防止頻繁創(chuàng)建線程導(dǎo)致的性能消耗。如果該異步方法存在阻塞的情況,又調(diào)用量大,注意有可能導(dǎo)致OOM(線程還未結(jié)束,又增加了更多的線程,最后導(dǎo)致內(nèi)存溢出)。@Async注解可以選擇使用自定義線程池。

它創(chuàng)建了SimpleAsyncTaskExecutor

說回RedisHttpSessionConfiguration,我們接著看:

@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
  RedisMessageListenerContainer container = new RedisMessageListenerContainer();
  container.setConnectionFactory(this.redisConnectionFactory);
  if (this.redisTaskExecutor != null) {
    container.setTaskExecutor(this.redisTaskExecutor);
  }
  if (this.redisSubscriptionExecutor != null) {
    container.setSubscriptionExecutor(this.redisSubscriptionExecutor);
  }
  container.addMessageListener(this.sessionRepository(), Arrays.asList(new PatternTopic("__keyevent@*:del"), new PatternTopic("__keyevent@*:expired")));
  container.addMessageListener(this.sessionRepository(), Collections.singletonList(new PatternTopic(this.sessionRepository().getSessionCreatedChannelPrefix() + "*")));
  return container;
}
RedisMessageListenerContainer正是處理監(jiān)聽的類,RedisMessageListenerContainer設(shè)置了不為空的redisTaskExecutor,因?yàn)閟pring session默認(rèn)沒有配置該Executor,那RedisMessageListenerContainer在處理監(jiān)聽時(shí)怎么使用線程呢?我們接著看RedisMessageListenerContainer的源碼:
public void afterPropertiesSet() {
  if (this.taskExecutor == null) {
    this.manageExecutor = true;
    this.taskExecutor = this.createDefaultTaskExecutor();
  }
  if (this.subscriptionExecutor == null) {
    this.subscriptionExecutor = this.taskExecutor;
  }
  this.initialized = true;
}
protected TaskExecutor createDefaultTaskExecutor() {
  String threadNamePrefix = this.beanName != null ? this.beanName + "-" : DEFAULT_THREAD_NAME_PREFIX;
  return new SimpleAsyncTaskExecutor(threadNamePrefix);
}

afterPropertiesSet()這個(gè)方法熟悉吧,這個(gè)方法將在所有的屬性被初始化后調(diào)用(InitializingBean接口細(xì)節(jié)這里不再贅述)。

 所以如果用戶沒有定義springSessionRedisTaskExecutor,Spring session將調(diào)用createDefaultTaskExecutor()方法創(chuàng)建SimpleAsyncTaskExecutor線程池。而這個(gè)“線程池”處理任務(wù)時(shí)每次都創(chuàng)建新的線程。所以你會(huì)發(fā)現(xiàn)很多個(gè)redisMessageListenerContailner-X線程。

總結(jié)

以上所述是小編給大家介紹的解決Spring session(redis存儲(chǔ)方式)監(jiān)聽導(dǎo)致創(chuàng)建大量redisMessageListenerContailner-X線程問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • eclipse+myeclipse 環(huán)境配置方法

    eclipse+myeclipse 環(huán)境配置方法

    eclipse+myeclipse配置環(huán)境
    2009-07-07
  • Java ArrayList 實(shí)現(xiàn)實(shí)例講解

    Java ArrayList 實(shí)現(xiàn)實(shí)例講解

    ArrayList是基于數(shù)組實(shí)現(xiàn)的,是一個(gè)動(dòng)態(tài)數(shù)組,其容量能自動(dòng)增長,類似于C語言中的動(dòng)態(tài)申請內(nèi)存,動(dòng)態(tài)增長內(nèi)存。這篇文章主要介紹了java ArrayList 實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Java語言實(shí)現(xiàn)簡單的酒店前臺(tái)管理小功能(實(shí)例代碼)

    Java語言實(shí)現(xiàn)簡單的酒店前臺(tái)管理小功能(實(shí)例代碼)

    這篇文章主要介紹了Java語言實(shí)現(xiàn)簡單的酒店前臺(tái)管理小功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java旋轉(zhuǎn)數(shù)組中最小數(shù)字具體實(shí)現(xiàn)(圖文詳解版)

    Java旋轉(zhuǎn)數(shù)組中最小數(shù)字具體實(shí)現(xiàn)(圖文詳解版)

    這篇文章主要給大家介紹了關(guān)于Java旋轉(zhuǎn)數(shù)組中最小數(shù)字具體實(shí)現(xiàn)的相關(guān)資料,旋轉(zhuǎn)數(shù)組,說明數(shù)據(jù)不變,只是改變位置,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群的方案

    Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群的方案

    Kubernetes是一個(gè)開源的容器編排平臺(tái),可以自動(dòng)化在部署、管理和擴(kuò)展容器化應(yīng)用過程中涉及的許多手動(dòng)操作,這篇文章主要介紹了Spring Boot集成kubernetes客戶端實(shí)現(xiàn)API操作k8s集群,需要的朋友可以參考下
    2024-08-08
  • 淺談javaSE 面向?qū)ο?Object類toString)

    淺談javaSE 面向?qū)ο?Object類toString)

    下面小編就為大家?guī)硪黄獪\談javaSE 面向?qū)ο?Object類toString)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 如何使用IDEA創(chuàng)建MAPPER模板過程圖解

    如何使用IDEA創(chuàng)建MAPPER模板過程圖解

    這篇文章主要介紹了如何使用IDEA創(chuàng)建MAPPER模板,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 清理本地Maven倉庫的方法示例

    清理本地Maven倉庫的方法示例

    這篇文章主要介紹了清理本地Maven倉庫的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java有界類型參數(shù)的實(shí)例用法

    java有界類型參數(shù)的實(shí)例用法

    小編給大家整理了一篇關(guān)于java有界類型參數(shù)的使用的相關(guān)文章及擴(kuò)展實(shí)例內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-07-07
  • SpringBoot3.x接入Security6.x實(shí)現(xiàn)JWT認(rèn)證的完整步驟

    SpringBoot3.x接入Security6.x實(shí)現(xiàn)JWT認(rèn)證的完整步驟

    這篇文章主要介紹了Spring?Boot?3.x中Spring?Security?6.x的安全配置變化,特別是JWT過濾器的工作原理和配置方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02

最新評論

开封市| 灯塔市| 偏关县| 孝义市| 木兰县| 和顺县| 怀远县| 兴隆县| 惠东县| 小金县| 木兰县| 清镇市| 泰顺县| 那坡县| 巴彦县| 梓潼县| 南京市| 靖西县| 晋州市| 博罗县| 黔西| 二手房| 安化县| 依兰县| 阿尔山市| 泰安市| 潼关县| 西乡县| 屏边| 交城县| 康乐县| 德阳市| 台前县| 周宁县| 阿坝县| 崇义县| 揭西县| 鞍山市| 宣化县| 寿宁县| 新化县|