zoukankan      html  css  js  c++  java
  • spring-data-redis 关于订阅客户端不断创建新线程的问题

    项目中使用了spring-data-redis 实现消息订阅功能,原来的配置是这样子:

    <redis:listener-container connection-factory="jedisConnectionFactory">
            <redis:listener ref="listener" serializer="jdkSerializer"
                method="onReceive" topic="mytopic" />
        </redis:listener-container>

    结果监控平台发现jvm totalStartedThreadCount不断增加,但是当前线程数却比较固定。一番问题定位、资料查阅之后,结合我对订阅模式的理解,认为应该是这个消息订阅引起的。查询了http://www.springframework.org/schema/redis/spring-redis.xsd关于listener-container的说明,果然,默认的task-executor和subscription-task-executor使用的是SimpleAsyncTaskExecutor。SimpleAsyncTaskExecutor每次都是简单粗暴的new一个新线程来执行任务。原因找到了,问题就容易解决了,配置改成下面这样子:

    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
            <!-- 核心线程数 -->     
            <property name="corePoolSize" value="50" />
            <!-- 最大线程数 -->  
            <property name="maxPoolSize" value="200" />
            <!-- 队列最大长度 -->
            <property name="queueCapacity" value="50000" />
            <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
            <property name="keepAliveSeconds" value="300" />
        </bean>
     
        <redis:listener-container connection-factory="jedisConnectionFactory" task-executor="taskExecutor">
            <redis:listener ref="listener" serializer="jdkSerializer"
                method="onReceive" topic="mytopic" />
        </redis:listener-container>
  • 相关阅读:
    Chrome书签导入IE或Maxthon的程序(三)
    解决word2003自定义工具栏被恢复问题
    Chrome书签导入IE或Maxthon的程序(二)
    解决比较Oracle中CLOB字段问题
    CodeRush Xpress For C#修改配置
    短信发送程序的编写
    poj1696 Space Ant
    数论一(hdoj 简单数学题、推理题)
    poj1338 寻找丑数
    poj2411 Mondriaan's Dream 棋盘覆盖
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/12029519.html
Copyright © 2011-2022 走看看