当前位置:网站首页>小心 transmittable-thread-local 的这个坑
小心 transmittable-thread-local 的这个坑
2022-07-30 11:25:00 【InfoQ】
异常现场
-javaagent:/path/to/transmittable-thread-local-2.12.1.jarorg.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' available: expected single matching bean but found 3: executor1,executor2,executor3
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:420)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1127)
……
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
……
AbstractApplicationContext.getBeanThreadPoolTaskExecutorNoUniqueBeanDefinitionException排查问题
public static void doSth(Object subtag, Object extra, long time) {
ApplicationContextContainer.getBean(ThreadPoolTaskExecutor.class)
.execute(() -> {
// 一些业务代码
});
}
@Component
public class ApplicationContextContainer implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextContainer.applicationContext = applicationContext;
}
}
applicationContext.getBeanThreadPoolTaskExecutor@Configuration
public class ExecutorConfig {
@Bean(value = "executor1")
public Executor executor1() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 一些初始化方法
taskExecutor.initialize();
return taskExecutor;
}
@Bean(value = "executor2")
public Executor executor2() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 一些初始化方法
taskExecutor.initialize();
return TtlExecutors.getTtlExecutor(taskExecutor);
}
@Bean(value = "executor3")
public Executor executor3() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 一些初始化方法
taskExecutor.initialize();
return TtlExecutors.getTtlExecutor(taskExecutor);
}
}
ExecutorThreadPoolTaskExecutorTtlExecutors.getTtlExecutorThreadPoolTaskExecutorTtlExecutors.getTtlExecutorpublic static Executor getTtlExecutor(@Nullable Executor executor) {
if (TtlAgent.isTtlAgentLoaded() || null == executor || executor instanceof TtlEnhanced) {
return executor;
}
return new ExecutorTtlWrapper(executor, true);
}
TtlExecutors.getTtlExecutorThreadPoolTaskExecutorif- 代码没改,之前好好地,怎么就报错了;
- 本地好使,为什么放在服务器上就报错了。
定位问题
TtlExecutors.getTtlExecutorif- TtlAgent.isTtlAgentLoaded():这个是判断 ttlAgentLoaded 标识,这个后文再说;
- null == executor:输入参数为 null,显然不符合;
- executor instanceof TtlEnhanced:输入参数是
TtlEnhanced类型,输入的是ThreadPoolTaskExecutor类型,不符合。
public static boolean isTtlAgentLoaded() {
return ttlAgentLoaded;
}
ttlAgentLoadedpublic final class TtlAgent {
public static void premain(final String agentArgs, @NonNull final Instrumentation inst) {
kvs = splitCommaColonStringToKV(agentArgs);
Logger.setLoggerImplType(getLogImplTypeFromAgentArgs(kvs));
final Logger logger = Logger.getLogger(TtlAgent.class);
try {
logger.info("[TtlAgent.premain] begin, agentArgs: " + agentArgs + ", Instrumentation: " + inst);
final boolean disableInheritableForThreadPool = isDisableInheritableForThreadPool();
// 省略非相关代码
ttlAgentLoaded = true;
} catch (Exception e) {
String msg = "Fail to load TtlAgent , cause: " + e.toString();
logger.log(Level.SEVERE, msg, e);
throw new IllegalStateException(msg, e);
}
}
// 省略非相关代码
}
premainExecutorConfigThreadPoolTaskExecutorExecutorTtlWrapperapplicationContext.getBean(clazz)-javaagent:/path/to/transmittable-thread-local-2.12.1.jartransmittable-thread-localExecutorConfigThreadPoolTaskExecutorapplicationContext.getBean(clazz)ThreadPoolTaskExecutorNoUniqueBeanDefinitionException-javaagent:/path/to/transmittable-thread-local-2.12.1.jar解决问题
applicationContext.getBean(beanName, clazz)public static void doSth(Object subtag, Object extra, long time) {
ApplicationContextContainer.getBean("executor1", ThreadPoolTaskExecutor.class)
.execute(() -> {
// 一些业务代码
});
}
边栏推荐
- 数据库性能系列之索引(上)
- I built another wheel: GrpcGateway
- Beyond Stream Processing!The 4th real-time computing Flink challenge is launched, and 490,000 prizes are waiting for you!
- EA中的业务对象和业务实体你分得清吗?
- [Database basics] redis usage summary
- 云原生应用的概念和云原生应用的 15 个特征
- 域名怎么注册备案解析?
- 物联网技术概论:第6章
- Performance testing of API Gateway APISIX on Google Cloud T2A and T2D
- 深入浅出零钱兑换问题——背包问题的套壳
猜你喜欢

深入浅出零钱兑换问题——背包问题的套壳

LeetCode_235_Last Common Ancestor of Binary Search Tree

电压继电器SRMUVS-100VAC-2H2D

Introduction to IoT Technologies: Chapter 6

SCM engineers written questions induction summary

VLAN实验

Redis master-slave replication

2022-07-29 顾宇佳 学习笔记 异常处理

文本的对齐方式、行高、空间 等总结

Difference between C# enumeration type and xaml
随机推荐
salesforce使用方法(salesforce authenticator下载)
Typroa alternative tool marktext
ADC0808/9 signal acquisition developed by single chip microcomputer
C# 枚举类型 于xaml 中区别
STM32F1读取MLX90632非接触式红外温度传感器
[Database basics] redis usage summary
Underwater target detection method based on spatial feature selection
feign远程调用时如何在请求头加入数据
不用if分支对同一个变量做判断的方法
云原生应用的概念和云原生应用的 15 个特征
Native js create table
Redis master-slave replication
AB test summary
pg_rewind 修复主备环境的时间线
Vim plugin GrepIt
单片机工程师笔试题目归纳汇总
基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)
MySQL database maintenance
单片机开发之静态LED显示
UE5 GAS Study Notes Postscript 0