并未做任何处理,但两次 toString 结果不一致,为啥?

2022-07-13 10:56:56 +08:00
 JinTianYi456
@Configuration
@EnableAsync
@Slf4j
public class ExecutorConfig {
    @Bean("taskExecutor")
    public ThreadPoolTaskExecutor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        return executor;
    }
}
// test code
        var executor = executorConfig.asyncServiceExecutor();
        System.err.println(System.identityHashCode(executor));
        System.err.println(executor);
        System.err.println(System.identityHashCode(executor));
        System.err.println(executor);
// output
2016053161
org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor@62730eda
2016053161
org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor@65d849e0
4723 次点击
所在节点    Java
35 条回复
lancelee01
2022-07-13 11:35:10 +08:00
用 Java 试了一下,是同一个对象。
```
ExecutorService pool = new ThreadPoolExecutor(8, 8, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
System.out.println(System.identityHashCode(pool));
System.out.println(pool);
System.out.println(System.identityHashCode(pool));
System.out.println(pool);
```
```

```
lancelee01
2022-07-13 11:39:51 +08:00
@lancelee01
1639705018
java.util.concurrent.ThreadPoolExecutor@61bbe9ba[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
1639705018
java.util.concurrent.ThreadPoolExecutor@61bbe9ba[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
JinTianYi456
2022-07-13 11:43:27 +08:00
@lancelee01 #1 我也觉得是一样的,但你没按照我的环境复现,比如 @Configuration ExecutorConfig ,以及是 LazyTraceThreadPoolTaskExecutor 、、因为我也不知道是哪里影响到了 toString 的结果
falsemask
2022-07-13 12:13:10 +08:00
@JinTianYi456 有没有可能和这个异步有关
JinTianYi456
2022-07-13 12:43:46 +08:00
@falsemask #4 只保留 @Configuration 也一样
wolfie
2022-07-13 13:49:06 +08:00
你这被 sleuth 增强过吧,看看 LazyTraceThreadPoolTaskExecutor#toString 有没有自定义,或者初始化时候有没有使用匿名内部类覆盖。
JinTianYi456
2022-07-13 13:54:09 +08:00
@wolfie #6 看过了,没有(它这输出样式就基本断定 Object 里的
Aruforce
2022-07-13 14:28:30 +08:00
查下这个类是不是被 spring 加载的。。如果不是。。 @Bean 相关的的 methodInvokeInterceptor 是不生效的
Aruforce
2022-07-13 14:29:13 +08:00
@Aruforce 或者你看下 @Configuration proxyBeanMethods 默认行为是不是 true
JinTianYi456
2022-07-13 14:36:09 +08:00
@Aruforce #9 System.err.println(executor.getClass().getName());
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor$$EnhancerBySpringCGLIB$$b9d128b3
Aruforce
2022-07-13 15:07:30 +08:00
@JinTianYi456 System.err.println(executor.getClass().getClassLoader().getClass().getName());
JinTianYi456
2022-07-13 15:09:30 +08:00
@Aruforce #11 java.net.URLClassLoader
zmal
2022-07-13 15:25:48 +08:00
一模一样的代码试了下:

1835794313
org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor@549ac12c
1835794313
org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor@549ac12c
BanGanExpert
2022-07-13 15:38:22 +08:00
把你自己的 test 生成的 class 字节码反编译或者直接贴出来分析,这个明显属于异常行为了呀,现在只有的代码片段理论上看不可能出现这种行为
BanGanExpert
2022-07-13 15:40:46 +08:00
如果反编译分析出来没有问题,就必须自己一行行 debug 去看下 JVM 运行时的行为了
ArthurTsang
2022-07-13 16:16:02 +08:00
你的确是有 2 个 ThreadPoolTaskExecutor 对象吧? 一个是 @Bean, 一个是手动调用方法 new 出来的
JinTianYi456
2022-07-13 16:23:39 +08:00
@ArthurTsang #16 看 test code ,没有 2 个啊。再说 Configuration#proxyBeanMethods
lancelee01
2022-07-13 17:07:20 +08:00
@ArthurTsang 楼主用的的确没有用 Spring 管理的 bean ,而是通过手动调用 asyncServiceExecutor 方法创建的,但是两次打印的还是同一个对象
lancelee01
2022-07-13 17:08:07 +08:00
@JinTianYi456 改成 Spring-boot 环境两次还是一样,你是不是看错了啊。
ApplicationContext context = SpringApplication.run(App.class);
var pool = context.getBean(ExecutorConfig.class).asyncServiceExecutor();
JinTianYi456
2022-07-13 17:13:20 +08:00
@lancelee01 #18 是 spring 管理的,请看 Configuration#proxyBeanMethods 的说明
2. 即使 `手动调用 asyncServiceExecutor` 我也只调用了一次啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.fyfyfm.apispeedy.workers.dev/t/865854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX