麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

解決Spring session(redis存儲方式)監聽導致創建大量redisMessageListenerContailner-X線程問題

2024-07-14 08:42:13
字體:
來源:轉載
供稿:網友

待解決的問題

Spring session(redis存儲方式)監聽導致創建大量redisMessageListenerContailner-X線程

解決辦法

為spring session添加springSessionRedisTaskExecutor線程池。

/** * 用于spring session,防止每次創建一個線程 * @return */@Beanpublic 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  //該處理監聽的線程池不是必須的,如果不自定義默認將使用SimpleAsyncTaskExecutor線程池)@Qualifier("springSessionRedisTaskExecutor")public void setRedisTaskExecutor(Executor redisTaskExecutor) {  this.redisTaskExecutor = redisTaskExecutor;}

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

題外話

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

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

它創建了SimpleAsyncTaskExecutor

說回RedisHttpSessionConfiguration,我們接著看:

@Beanpublic 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正是處理監聽的類,RedisMessageListenerContainer設置了不為空的redisTaskExecutor,因為spring session默認沒有配置該Executor,那RedisMessageListenerContainer在處理監聽時怎么使用線程呢?我們接著看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()這個方法熟悉吧,這個方法將在所有的屬性被初始化后調用(InitializingBean接口細節這里不再贅述)。

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

總結

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 369看片你懂的小视频在线观看 | 羞羞羞羞视频 | 欧洲精品色 | 免费一级肉体全黄毛片 | 永久免费黄色大片 | 蜜桃成品人免费视频 | 国产精品久久久久久久久久久久久久久 | 免费a级片视频 | 国产人成精品综合欧美成人 | 日韩视频区 | 中国av免费在线观看 | 欧美性受xxxx白人性爽 | 成人在线视频精品 | 视频一区二区久久 | 黄色作爱视频 | 精品中文字幕在线观看 | 成人在线观看免费 | 中文国产在线视频 | 日韩a毛片免费观看 | 99re久久最新地址获取 | 13一14毛片免费看 | 成人毛片视频在线播放 | 91精品国产91 | 天天看夜夜爽 | 热99在线 | 国产一级桃视频播放 | 欧美日韩中文字幕在线视频 | 日本不卡二区 | 国产精品观看在线亚洲人成网 | 精品一区二区三区免费 | 久草影音 | 国产一区二区三区在线免费观看 | 黄色大片www | 欧洲精品久久 | www.com香蕉 | 综合网天天射 | 久久男人 | 国产精品久久久久久久久粉嫩 | 免费a级毛片大学生免费观看 | 免费永久在线观看黄网 | 成人在线视频网 |