ccl125
ccl125
作者大大好,整个项目快看到尾声了,在这节内容上有些问题。 分支:circular-reference-with-proxy-bean 1. 解决有代理对象的循环依赖问题,因为上一节中,singletonObjects(一级缓存)和earlySingletonObjects(二级缓存)没办法解决有代理对象循环依赖的问题,所以这节中引入了singletonFactory(三级缓存),在代码中的体现就是`AbstractAutowireCapableBeanFactory#doCreateBean()`方法,这个方法在75行的时候,通过bean复制一个finalBean对象,然后放入singletonFactories三级缓存中,接着在第104行通过`getSingleton(beanName)`这个方法就是会先从一级缓存找,然后接着二级缓存找,最后再三级缓存中找,对应到项目实际debug的过程中,实际上从三级缓存中去获取,就是调用了`singletonFactory.getObject()`该方法。也就是上面75行存入的三级对象的getObject方法,最终返回这个代理对象。这是我的理解。那这样的话问题就来了,就是在整个bean的生命周期,还有其他很多的操作步骤,比如BeanPostProcessor修改属性值,填充属性,以及初始化前后的处理,那么实际上对应的代码就是刚刚上面提到75行和104行中间的很多操作步骤。也就是说我们最终获取到的代理bean是根据一开始75行存入三级缓存中的finalBean。而在这个之后,代码中的很多步骤都是对原先bean去做的操作。那75-104行在bean生命周期内所做的操作岂不是对代理对象都不生效了?那代理对象的属性什么的设置是不是就都有问题了。 2. 另一个问题还是在doCreateBean()方法内,就是获取到代理对象后,105行的代码`addSingleton(beanName, exposedObject)`,这里紧接着将对象放入一级缓存中,并将二级三级缓存进行清空,结合104行的代码,整个过程看起来像是获取到代理对象后,先放入二级缓存中,然后将三级缓存中的清空,接着再放入一级缓存中,再将二级三级缓存清空。所以这里看起来好像放入二级缓存中什么也没操作,那不如直接放入一级缓存,因为放入二级缓存后什么都没操作就又取出来放入一级缓存中了,这里不是太理解。 这节内容debug过程中很多嵌套的,所以理解起来不是很容易,可能自己陷入了某个单独流程上,没办法从整体上去理解。再次感谢作者,学习到了很多东西
### 使用场景: 我们的业务是这样的,会有多个不同的任务类型的离线任务,目前现状是多个任务类型用的一个公共的大的线程池。 比如总共30个线程由6个不同的任务类型去共用这些线程资源。 期望是做到不同任务类型线程隔离,每个任务类型用各自的线程池,做到线程池拆分。拆分后每个任务类型有5个线程资源。 想做到的效果是,虽然不同任务类型线程池隔离了,但是如果某一类型的任务当前没有的话,这类任务中的线程池资源可以给其他任务类型。因为如果不这样的话就会导致如果系统当前只有一个任务类型的话,不能重复利用所有的资源。 同时当系统某类任务多的时候也要保证不能把其他任务类型的线程资源全部占用掉。比如每个任务类型5个线程池,A类型的任务此时比较多,B类型的任务没有,那么A类型的任务可以把3个B类型的任务的线程资源划分到A类型的线程池中,这样保证如果突然来了B类型的任务,不至于B类型的任务一点资源都没有。 **想问下针对这种使用场景,dynamic-tp适用吗?**
### Search before asking - [X] I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found no similar issues. ### Question 比如根据系统的cpu利用率,jvm的运行情况,下游服务的资源状况等这些特定的资源参数,动态调整线程池中线程的数量呢? 我们目前的业务场景是可以根据配置中心动态的修改线程池的参数,但是参数的配置还是要靠人来操作,期望能够根据系统和上下游的负载等一些指标,来动态的去调整参数。 看了下文档,好像没有这部分的内容,动态变更也只是说的运行时动态变化,我理解还是监听的人为的操作或者一些告警监控来实现的吧?
### Describe the usage question you have. Please include as many useful details as possible. In my project, I am using the following code to write Parquet files to the...