dromara / dynamic-tp

🔥🔥🔥轻量级动态线程池,内置监控告警功能,集成三方中间件线程池管理,基于主流配置中心(已支持Nacos、Apollo,Zookeeper、Consul、Etcd,可通过SPI自定义实现)。Lightweight dynamic threadpool, with monitoring and alarming functions, base on popular config centers (already support Nacos、Apollo、Zookeeper、Consul, can be customized through SPI).
https://dynamictp.cn
Apache License 2.0
3.77k stars 763 forks source link

dubbo 2.7.5以下的版本动态线程池不生效 #400

Closed piemon-nyah closed 7 months ago

piemon-nyah commented 7 months ago

版本信息

问题描述

2.7.5以下的dubbo动态线程池似乎无法生效,org.dromara.dynamictp.adapter.dubbo.apache.ApacheDubboDtpAdapter是将DataStore中的线程池替换成了动态线程池 image-20240220094555520 但在dubbo 2.7.5以下的版本, org.apache.dubbo.remoting.transport.dispatcher.WrappedChannelHandler#getExecutorService中并不会通过DataStore获取线程池,而是直接用WrappedChannelHandler中的线程池 image 由于ApacheDubboDtpAdapter中putAndFinalize方法会关闭原始线程池,导致dubbo调用中只能使用SHARED_EXECUTOR image image 在2.7.5及以上版本则不会有上述问题, 因为org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository#getExecutor获取线程池会通过data获取 image 与dynamictp修改的逻辑一致 image 测试只有两个线程执行 image

解决方法

考虑获取WrappedChannelHandler对象,直接修改WrappedChannelHandler中的executor,我自己有尝试改一版,可以提交下pr一起看看

KamToHung commented 7 months ago

版本信息

  • Jdk版本:1.8
  • SpringBoot版本:2.1.18
  • DynamicTp版本:1.1.6.1
  • 配置中心版本:/

问题描述

2.7.5以下的dubbo动态线程池似乎无法生效,org.dromara.dynamictp.adapter.dubbo.apache.ApacheDubboDtpAdapter是将DataStore中的线程池替换成了动态线程池 image-20240220094555520 但在dubbo 2.7.5以下的版本, org.apache.dubbo.remoting.transport.dispatcher.WrappedChannelHandler#getExecutorService中并不会通过DataStore获取线程池,而是直接用WrappedChannelHandler中的线程池 image 由于ApacheDubboDtpAdapter中putAndFinalize方法会关闭原始线程池,导致dubbo调用中只能使用SHARED_EXECUTOR image image 在2.7.5及以上版本则不会有上述问题, 因为org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository#getExecutor获取线程池会通过data获取 image 与dynamictp修改的逻辑一致 image 测试只有两个线程执行 image

解决方法

考虑获取WrappedChannelHandler对象,直接修改WrappedChannelHandler中的executor,我自己有尝试改一版,可以提交下pr一起看看

好,指派给你了