spring taskExecutor redis redisMessageListenerContailner线程优化
2017-08-08 13:17
375 查看
背景:
测试工程师给系统做压力测试,发现JVM产生了大量的redisMessageListenerContainer线程,系统跑着跑着进程就被kill掉了
查看源码:
进入redisMessageListenerContainer 类打断点进去,查看内部代码
redisMessageListenerContainer.java
RedisHttpSessionConfiguration.Java
解决方案:
XML中添加一个redis线程池,问题解决
测试工程师给系统做压力测试,发现JVM产生了大量的redisMessageListenerContainer线程,系统跑着跑着进程就被kill掉了
查看源码:
进入redisMessageListenerContainer 类打断点进去,查看内部代码
redisMessageListenerContainer.java
public void onMessage(Message message, byte[] pattern) { Collection<MessageListener> listeners = null; // if it's a pattern, disregard channel if (pattern != null && pattern.length > 0) { listeners = patternMapping.get(new ByteArrayWrapper(pattern)); } else { pattern = null; // do channel matching first listeners = channelMapping.get(new ByteArrayWrapper(message.getChannel())); } if (!CollectionUtils.isEmpty(listeners)) { dispatchMessage(listeners, message, pattern); } } } private void dispatchMessage(Collection<MessageListener> listeners, final Message message, final byte[] pattern) { final byte[] source = (pattern != null ? pattern.clone() : message.getChannel()); for (final MessageListener messageListener : listeners) { taskExecutor.execute(new Runnable() {// 使用了线程池 public void run() { processMessage(messageListener, message, source); } }); } } // 测试工程师给系统做压力测试,发现JVM产生了大量的redisMessageListenerContainer线程,系统跑着跑着进程就被kill掉了 public void afterPropertiesSet() { if (taskExecutor == null) {// 如果没有设置默认的使用的是SimpleAsyncaskExecutor,这是一个简单的执行器,并不有线程池功能 manageExecutor = true; taskExecutor = createDefaultTaskExecutor(); } if (subscriptionExecutor == null) { subscriptionExecutor = taskExecutor; } initialized = true; } protected TaskExecutor createDefaultTaskExecutor() { String threadNamePrefix = (beanName != null ? beanName + "-" : DEFAULT_THREAD_NAME_PREFIX); return new SimpleAsyncTaskExecutor(threadNamePrefix); }
RedisHttpSessionConfiguration.Java
@Bean public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, RedisOperationsSessionRepository messageListener) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); if(this.redisTaskExecutor != null) { container.setTaskExecutor(this.redisTaskExecutor); } if(this.redisSubscriptionExecutor != null) { container.setSubscriptionExecutor(this.redisSubscriptionExecutor); } container.addMessageListener(messageListener, Arrays.asList(new PatternTopic[]{new PatternTopic("__keyevent@*:del"), new PatternTopic("__keyevent@*:expired")})); container.addMessageListener(messageListener, Arrays.asList(new PatternTopic[]{new PatternTopic(messageListener.getSessionCreatedChannelPrefix() + "*")})); return container; } @Qualifier("springSessionRedisTaskExecutor") public void setRedisTaskExecutor(Executor redisTaskExecutor) { this.redisTaskExecutor = redisTaskExecutor; }
解决方案:
XML中添加一个redis线程池,问题解决
<bean id="springSessionRedisTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 核心线程数 --> <property name="corePoolSize" value="10" /> <!-- 最大线程数 --> <property name="maxPoolSize" value="300" /> <!-- 队列最大长度 --> <property name="queueCapacity" value="500" /> <!-- 线程池维护线程所允许的空闲时间,默认为60s --> <property name="keepAliveSeconds" value="60" /> </bean>
相关文章推荐
- Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程
- 解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题
- Spring taskExecutor运行后台线程在Tomcat停止时时主动退出的方法
- Spring中ThreadPoolTaskExecutor的线程调度及问题
- Kafka集成Spring-AcknowledgeMessageListener接口实现
- org.springframework.core.task.TaskRejectedException:Executor[]did not accept task异常解决
- 关于Spring 任务调度之task:scheduler与task:executor配置的详解
- SpringTaskExecutor介绍
- spring jms DefaultMessageListenerContainer分析
- 使用Spring中的线程池ThreadPoolTaskExecutor实现JAVA并发
- Spring中的ThreadPoolTaskExecutor
- redis服务器整合spring(优化)
- 使用SPRING中的线程池ThreadPoolTaskExecutor实现并发
- Spring线程池ThreadPoolTaskExecutor配置及详情
- SPRING中的线程池ThreadPoolTaskExecutor
- 【Spring】Spring高级话题-多线程-TaskExecutor
- Spring线程池配置使用---ThreadPoolTaskExecutor 配置
- Spring中的线程池ThreadPoolTaskExecutor
- JMS(Jboss Messaging)的一点使用心得(十一)Spring扩展应用-可自动重连的JmsMessageListenerContainer的另一种实现
- spring_ThreadPoolTaskExecutor和jdk1_7_ThreadPoolExecutor原理解析