Примените аспект к бобам, не управляемым пружиной - PullRequest
0 голосов
/ 28 сентября 2018

Применить аспект к 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

Код в 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>`

1 Ответ

0 голосов
/ 05 ноября 2018

Я проверил ваш репозиторий GitHub.Сначала я распаковал и удалил все ZIP-файлы (очень уродливо для их фиксации, особенно включая содержимое каталога target ) и добавил родительский POM, чтобы иметь возможность правильно построить весь проект.Затем я заметил, что было несколько неправильных вещей:

Если вы хотите использовать свой аспектный модуль через LTW, вам нужно предоставить правильно настроенный файл aop.xml в соответствии с Документация по AspectJ LTW , например, так:

<aspectj>
  <aspects>
    <aspect name="com.test.compensating.operation.aspect.PerformanceMetricsAspect"/>
  </aspects>

  <weaver options="-verbose -showWeaveInfo">
    <include within="com.test..*"/>
  </weaver>
</aspectj>

Кроме того, ваш pointcut был неверен:

@Around("execution(* com.test.manager.performOperation())")

Вместо этого он должен быть (обратите внимание на обозначение ..):

@Around("execution(* com.test.manager..performOperation())")

Теперь вы можете запустить свой основной класс из IDE и увидеть следующий вывод журнала во время запуска:

[AppClassLoader@18b4aac2] info AspectJ Weaver Version 1.9.1 built on Friday Apr 20, 2018 at 16:47:33 GMT
[AppClassLoader@18b4aac2] info register classloader sun.misc.Launcher$AppClassLoader@18b4aac2
[AppClassLoader@18b4aac2] info using configuration /C:/Users/alexa/Documents/java-src/SO_AJ_Spring_ApplyOnNonSpring/calculate-metrics/target/classes/META-INF/aop.xml
[AppClassLoader@18b4aac2] info register aspect com.test.compensating.operation.aspect.PerformanceMetricsAspect
[AppClassLoader@18b4aac2] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified
(...)
INFO  [2018-11-05 11:23:03,317] org.eclipse.jetty.server.ServerConnector: Started application@7249dadf{HTTP/1.1}{0.0.0.0:8080}
INFO  [2018-11-05 11:23:03,321] org.eclipse.jetty.server.ServerConnector: Started admin@4362d7df{HTTP/1.1}{0.0.0.0:8081}
INFO  [2018-11-05 11:23:03,322] org.eclipse.jetty.server.Server: Started @4168ms

Если вы обращаетесь к http://localhost:8080/task-list,, вытакже обратите внимание, что этот аспект работает:

[AppClassLoader@18b4aac2] weaveinfo Join point 'method-execution(void com.test.manager.AdditionManager.performOperation())' in Type 'com.test.manager.AdditionManager' (AdditionManager.java:16) advised by around advice from 'com.test.compensating.operation.aspect.PerformanceMetricsAspect' (PerformanceMetricsAspect.java)

  ########### I am here aaaaaaaaaaaa
Adding 2 numbers 1 2 = 12
Exiting method [com.test.manager.AdditionManager.performOperation]; exec time (ms): 0
0:0:0:0:0:0:0:1 - - [05/Nov/2018:11:23:12 +0000] "GET /task-list HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" 251

Кроме того, ваш UAR JAR также был настроен неправильно, то есть приложение выдало ошибку при запуске из Uber JAR.Никогда прежде не используя Dropwizard, я гуглил и затем исправлял это вот так .

Я создал ветвь репо и запрос на получение длявы.Наслаждайтесь!

...