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

好像不支持 TtlExecutors #425

Open shanhm1991 opened 3 months ago

shanhm1991 commented 3 months ago

首先感谢您使用 DynamicTp,如果对项目有好的想法建议,请按照下述模板提议讨论,建议使用 Markdown 语法

解析DynamicTp时对bean这里做过滤,能不能直接支持Executor,不然使用 TtlExecutors.getTtlExecutor(taskExecutor); 装饰的线程池就被忽略了

@Override
    public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
        if (!(bean instanceof ThreadPoolExecutor) && !(bean instanceof ThreadPoolTaskExecutor)) {
            return bean;
        }
        if (bean instanceof DtpExecutor) {
            return registerAndReturnDtp(bean);
        }
        // register juc ThreadPoolExecutor or ThreadPoolTaskExecutor
        return registerAndReturnCommon(bean, beanName);
    }
KamToHung commented 3 months ago

首先感谢您使用 DynamicTp,如果对项目有好的想法建议,请按照下述模板提议讨论,建议使用 Markdown 语法

解析DynamicTp时对bean这里做过滤,能不能直接支持Executor,不然使用 TtlExecutors.getTtlExecutor(taskExecutor); 装饰的线程池就被忽略了

@Override
    public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
        if (!(bean instanceof ThreadPoolExecutor) && !(bean instanceof ThreadPoolTaskExecutor)) {
            return bean;
        }
        if (bean instanceof DtpExecutor) {
            return registerAndReturnDtp(bean);
        }
        // register juc ThreadPoolExecutor or ThreadPoolTaskExecutor
        return registerAndReturnCommon(bean, beanName);
    }

如果想使用ttl,可以通过dynamic-top的包装器包装,支持TtlTaskWrapper

shanhm1991 commented 3 months ago

感谢回复,这个问题暂时规避了,改成了只包装里面的Runnable

public void execute(Runnable task) {
        super.execute(TtlRunnable.get(task, false, true));
}

另外感觉有个问题,在DtpRunnable执行run时是不是应该将跟踪id值设置一下 MDC.put(TRACE_ID, traceId);

这里加了一个自己需要的跟踪id,不然任务线程打印日志中获取不到

image

KamToHung commented 3 months ago

感谢回复,这个问题暂时规避了,改成了只包装里面的Runnable

public void execute(Runnable task) {
        super.execute(TtlRunnable.get(task, false, true));
}

另外感觉有个问题,在DtpRunnable执行run时是不是应该将跟踪id值设置一下 MDC.put(TRACE_ID, traceId);

这里加了一个自己需要的跟踪id,不然任务线程打印日志中获取不到

image

MDC也有个包装器,MdcTaskWrapper可以使用,MDC.put应该属于业务处理,可以在execute之前put

shanhm1991 commented 3 months ago

1718347569883

这里是不是返回proxy更好(直接返回bean,虽然可以注入ThreadPoolTaskExecutor,但已经是一个被Terminated的实例)

本地话将返回改成了proxy,注入类型换成ThreadPoolExecutor,简单规避掉了问题

yanhom1314 commented 3 months ago

1718347569883

这里是不是返回proxy更好(直接返回bean,虽然可以注入ThreadPoolTaskExecutor,但已经是一个被Terminated的实例)

本地话将返回改成了proxy,注入类型换成ThreadPoolExecutor,简单规避掉了问题

Terminated 的是bean里面的threadPoolExecutor,返回之前已经通过反射将proxy设置到bean里了,所以返回bean没问题。而且proxy是个ThreadPoolExecutor,直接返回,原始类型是ThreadPoolTaskExecutor,会报类型转换错误