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

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

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

待解決的問題

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

解決辦法

為spring session添加springSessionRedisTaskExecutor線程池。

/**
 * 用于spring session,防止每次創(chuàng)建一個線程
 * @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è)置最大并發(fā)線程數(shù)量。)

@EnableAsync開啟異步方法,背后默認(rèn)使用的就是這個線程池。使用異步方法時如果業(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,因為spring session默認(rèn)沒有配置該Executor,那RedisMessageListenerContainer在處理監(jiān)聽時怎么使用線程呢?我們接著看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()這個方法熟悉吧,這個方法將在所有的屬性被初始化后調(diào)用(InitializingBean接口細(xì)節(jié)這里不再贅述)。

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

北宁市| 洪湖市| 靖江市| 崇文区| 乌拉特前旗| 东乡族自治县| 简阳市| 大邑县| 保德县| 罗城| 布尔津县| 古交市| 西城区| 福泉市| 崇义县| 墨玉县| 乐山市| 蕲春县| 哈巴河县| 武宁县| 岗巴县| 榆社县| 易门县| 仪征市| 芦山县| 大名县| 尤溪县| 永修县| 成都市| 扎囊县| 怀安县| 繁峙县| 兴安盟| 抚顺市| 建昌县| 三江| 永吉县| 香河县| 甘泉县| 偃师市| 慈溪市|