Применить аспект к bean-компонентам, не управляемым пружиной
У меня есть интеграционный тест, который вызывает микро-сервис (abc-сервис), реализованный с использованием структуры drop-wizard.Мой интеграционный тест вызывает конечную точку ресурса внутри микросервиса.Этот abc-сервис имеет зависимости от 2-х модулей, которые у меня есть в abc-service pom.xml
a.Аспект-модуль
б.Xyz-module -> этот модуль выполняет http-вызовы к сторонней службе (не в нашем домене).Этот xyz-модуль имеет 15 классов менеджера, и у каждого класса есть общедоступные статические методы, которые делают вызовы http для внешней службы, я хочу вычислить время обработки для всех вызовов http, т.е. я хочу применить @ Around advice на всех открытых статических методах, которые делают вызовы http во всех классах менеджера.Все классы в xyz-модуле являются бобами, не управляемыми пружинами
![enter image description here](https://i.stack.imgur.com/cKNhY.jpg)
Код в Aspect-модуле
package com.company.abc.operation.aspect
@Aspect
public class AppPerformanceMetricsAspect {
//@Around("execution(* com.company.product.abc.manager..*(..))") -- did'nt work
//@Around("execution(* com.company.product.abc.manager.*.*(..))") -- did'nt work
//@Pointcut("execution(* com.company.product.abc.manager.StoreDocumentManager.helloWorld(..))") -- did'nt work
// @Pointcut("within(om.company.product.abc.manager.*)") -- did'nt work
@Around("execution(* com.company.product.abc.manager.StoreDocumentManager.helloWorld())") //-- did'nt work
public Object getVaultManagerPerformanceMetrics(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("\n\n\n ########### I am here aaaaaaaaaaaa");
String packageName = proceedingJoinPoint.getSignature().getDeclaringTypeName();
String methodName = proceedingJoinPoint.getSignature().getName();
long start = System.currentTimeMillis();
Object output = proceedingJoinPoint.proceed();
long elapsedTime = System.currentTimeMillis() - start;
System.out.println("Exiting method [" + packageName + "." + methodName + "]; exec time (ms): " + elapsedTime);
return output;
}
}
Код в микро-service (класс конфигурации в abc-microservice), который загружает аспект при запуске микросервиса. Я вижу аспект ( AppPerformanceMetricsAspect ), который регистрируется в контейнере Spring, захватывает журналы при запуске abc-службы(микро-сервис)
INFO [2018-09-28 13:54:28,809] org.springframework.beans.factory.support.DefaultListableBeanFactory: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@14b99c84: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,springConfiguration,signingStrategyFactory,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,supportCompensatingOperationsAspect,org.springframework.context.annotation.LoadTimeWeavingConfiguration,loadTimeWeaver,org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration,org.springframework.context.config.internalBeanConfigurerAspect, AppPerformanceMetricsAspect]; root of factory hierarchy
Несколько стеков над статьями предлагают удалить @EnableAspectJAutoProxy и использовать @EnableLoadTimeWeaving.Чтобы EnableLoadTime работал, я использовал параметры
VM: -javaagent: C: /dev/selenium/aspectj-weaver.jar -javaagent: C: /dev/selenium/spring-instrument-4.3.3.RELEASE.jar
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) – didn’t work
@EnableSpringConfigured – didn’t work
//@EnableAspectJAutoProxy(proxyTargetClass = true) – this didn’t work
@ComponentScan(basePackages="com.company.abc.operation.aspect")
// path to the package where my aspect is defined AppPerformanceMetricsAspect
@Configuration
public class SpringConfiguration {
@Bean
public VaultManagerPerformanceMetricsAspect vaultManagerPerformanceMetricsAspect() {
return new VaultManagerPerformanceMetricsAspect();
} // even this didn’t work
}
=================================================================================== * Попытка 1 :Я пытаюсь интегрировать ваше решение в мой проект, но он не работает.Когда я запускаю свой микро-сервис с параметрами виртуальной машины как
-javaagent: C: /dev/selenium/aspectj-weaver.jar -javaagent: C: /dev/selenium/spring-instrument-4.3.3.RELEASE.jar
Это то, что я вижу в журналах
Я вижу, что все классы в пакете (com.abc.test.xyz.manager) становятся переплетенными
`[AppClassLoader@561279c8] debug weaving 'com.abc.test.xyz.manager.TestManager'
[AppClassLoader@561279c8] weaveinfo Join point 'method-execution(void'com.abc.test.xyz.manager.TestManager.execute())' in Type ''com.abc.test.xyz.manager.TestManager ' (TestManager.java:23) advised by around advice from 'com.test.compensating.operation.aspect.PerformanceMetricsAspect' (PerformanceMetricsAspect.java)'
, но когдаЯ пытаюсь запустить свой тест
'ERROR [2018-11-30 19:15:14,435] com.abc.dropwizard.exceptionmappers.GenericExceptionMapper: Unhandled Service Error
! java.lang.NoSuchMethodError: com.test.compensating.operation.aspect.PerformanceMetricsAspect.aspectOf()Lcom/test/compensating/operation/aspect/PerformanceMetricsAspect;`
Я запускаю свой микро-сервис с использованием Java 1.7 Убедитесь, что в моем проекте микро-сервиса (похожем на проект Tasklist-Service, который я создал в github в моем предыдущем посте) есть эта записьв pom.xml `
<build>
…
…
<plugin>
<groupId>com.jcabi</groupId>
<artifactId>jcabi-maven-plugin</artifactId>
<version>0.14.1</version>
<executions>
<execution>
<goals>
<goal>ajc</goal>
</goals>
</execution>
</executions>
</plugin>
</build>`
Мой аспект определен в другом модуле, то есть в модуле abc-comparing-операций, и это похоже на проект вычисления метрик, который я создал в github в моем предыдущем посте abc-compancingМодуль -operations имеет следующие зависимости в pom.xml
`<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.1</version>
</dependency>`