【问题标题】:AWS XRay recorder trying to instrument classes on startupAWS XRay 记录器尝试在启动时检测类
【发布时间】:2018-05-07 22:53:06
【问题描述】:

我正在尝试将 aws-xray-recorder-sdk-spring 库添加到现有的 Spring Boot 服务中,如 docs here 中所述。

我在启动时收到此错误:

{"@timestamp":"2018-05-08T08:04:23.026+10:00","@version":1,"message":"Application run failed","logger_name":"org.springframework.boot.SpringApplication","thread_name":"main","level":"ERROR","level_value":40000,"stack_trace":"org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'meterRegistryPostProcessor' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: warning no match for this type name: org.springframework.data.repository.Repository [Xlint:invalidAbsoluteTypeName]
\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:591)
\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
\tat org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
\tat org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
\tat org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
\tat org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
\tat org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:238)
\tat org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:709)
\tat org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:534)
\tat org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
\tat org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
\tat org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
\tat org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
\tat net.nxbos.vti.Application.main(Application.java:34)
Caused by: java.lang.IllegalArgumentException: warning no match for this type name: org.springframework.data.repository.Repository [Xlint:invalidAbsoluteTypeName]
\tat org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:319)
\tat org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:226)
\tat org.springframework.aop.aspectj.AspectJExpressionPointcut.obtainPointcutExpression(AspectJExpressionPointcut.java:197)
\tat org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:176)
\tat org.springframework.aop.support.AopUtils.canApply(AopUtils.java:224)
\tat org.springframework.aop.support.AopUtils.canApply(AopUtils.java:283)
\tat org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:315)
\tat org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:124)
\tat org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:93)
\tat org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:74)
\tat org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:352)
\tat org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:304)
\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:438)
\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1714)
\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
\t... 15 common frames omitted
"}

我已将拦截器设置为在带有 @XRayEnabled 注释的类上运行,就像这样

  @Override
  @Around("@annotation(com.amazonaws.xray.spring.aop.XRayEnabled)")
  public void xrayEnabledClasses() {}

我的项目中没有spring-data,所以有点困惑为什么 AOP 会尝试匹配它。

有一个post here 提到启动时线程本地使用可能是罪魁祸首,并建议手动检测。如果可能,更愿意使用 AWS SDK,对上述错误有什么想法吗?

AWS X-Ray Recorder SDK 依赖于 InheritableThreadLocal 存储在 为了传播有关当前(子)段的信息 在整个程序的执行过程中。似乎Spring正在使用 预先实例化的 ThreadPoolExecutor 来运行它的 Bean 创建任务。 因此,“InitializerListener”段,在创建后 备用线程,不可用于 I18nCache 初始化 功能。

【问题讨论】:

  • 我不知道 Spring 或 AWS,但快速查看 GitHub 存储库表明您的项目中确实有 spring-data-commons 作为aws-xray-recorder-sdk-spring 根据POM。这有帮助吗?然后我可以将其转换为答案。顺便说一句,mvn dependency:treemvn dependency:analyze 通常也是你的朋友。
  • 您好,如果我想为您提供帮助,我将不胜感激。
  • @kriegaex 我无法让这个库很好地发挥作用,所以我最终删除了自动检测器,并创建了自己的库/注释来检测 XRay。这是一个向 AWS 开发工具包客户端添加请求处理程序,然后使用注释来包装开始/结束段的案例
  • 那么请添加一个带有解决方案的综合答案并接受它以关闭问题或删除问题。你知道 SO 是如何工作的,你有 7.7k 的声誉。

标签: spring-aop aws-xray


【解决方案1】:

我遇到了同样的问题。我发现我的项目缺少 spring-data-commons 依赖项。结果,我们遇到了 org.springframework.data.repository.Repository 的 ClassNotFoundException。 Spring AOP 掩盖了异常。添加此依赖项后,我的问题得到解决。

【讨论】:

  • 这为我解决了这个问题
猜你喜欢
  • 2023-04-01
  • 2019-12-28
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
相关资源
最近更新 更多