AspectJ с Spring AOP и Load Time Weaving (LTW) в приложении, работающем в контейнере Docker.JAVA

Программисты JAVA общаются здесь
Гость
AspectJ с Spring AOP и Load Time Weaving (LTW) в приложении, работающем в контейнере Docker.

Сообщение Гость »

У меня есть Java-приложение Spring Boot, работающее в контейнере Docker.
Я хочу использовать AOP, чтобы использовать пользовательскую аннотацию для перехвата методов и расчета времени их выполнения. Типичный вариант использования.
В частности, мне нужно иметь возможность профилировать ЛЮБОЙ метод, к которому я прикрепляю эту аннотацию. Это означает, что частные методы и методы, вызываемые из одного и того же класса.
Что я узнал
Я уже узнал, что в приложении Spring мне понадобятся некоторые дополнительные конфигурации, чтобы это работало, поскольку АОП Spring будет перехватывать только общедоступные методы в одном компоненте, вызываемые из другого компонента. Мне нужно будет настроить AspectJ AOP Within Spring и, видимо, также нужно будет настроить Load Time Weaving.
Вопрос в целом заключается в том, как мне это сделать. Ниже приведено все, что я знаю и уже сделал. Что работает, что нет, в чем я не уверен и все такое.
Вот что я уже сделал
ПРИМЕЧАНИЕ: я изменил некоторые ссылки и элементы исходного кода, чтобы сохранить общий вид. Поэтому, оценивая, что не так, имейте в виду, что некоторые проблемы компиляции могут быть связаны только с тем, что
  • Я создал аннотацию

    Код: Выделить всё

    @Target({
    ElementType.METHOD
    })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Profile {
    String value();
    }
    
  • Я создал аспект

    Код: Выделить всё

    @Component
    @Aspect
    public class ProfilerAspect {
    
    @Around("@annotation(Profile)")
    public void profile(ProceedingJoinPoint joinPoint) throws Throwable {
    // Do stuff
    joinPoint.proceed();
    }
    }
    
    Правильна ли эта настройка? Я видел другие структуры аспектов, использующие отдельный метод с @Pointcut("..."), а затем другой метод с @Around("ранее упомянутый метод()"). Я знаю, что моя установка работает с Spring AOP для общедоступных методов, вызываемых из другого bean-компонента.
[*]Я создал aop .xml в META-INF [*]Я включил переплетение времени загрузки через конфигурацию Java

Код: Выделить всё

@SpringBootApplication
@EnableLoadTimeWeaving
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
[*]Я также пробовал включить переплетение времени загрузки через конфигурацию XML в моем файле Controllers.xml, например
  • Я также пробовал указать InstrumentationLoadTimeWeaver

    когда я это делаю, приложение запускается, но аннотация работает только для общедоступных методов, вызываемых из другого компонента
  • Есть ли мне следовало использовать другое пользовательское время загрузки Weaver?



Вот и все. Если не считать всяких тыканий и подтыканий, это, по сути, вся установка, которая у меня есть и которая не работает. В конце дня всегда происходит ошибка при запуске.

Код: Выделить всё

  Caused by: java.lang.IllegalStateException: ClassLoader [org.springframework.boot.loader.LaunchedURLClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar
Я читал во многих местах, что мне нужно запускать приложение, передавая аргумент --javaagent

Код: Выделить всё

-javaagent:path/to/spring-instrument.jar
Мои вопросы
  • Нужно ли мне это делать?

    Есть ли ЛЮБОЙ способ сделать это в коде, чтобы мне не приходилось изменять сценарии сборки (полностью управляемые другой командой)
[*]Я где-то читал, что мне может потребоваться добавить более одного агента, это правда?

[*]Как поместить jar в Docker-контейнер

[*]Как узнать путь из сборки сценарий



Источник: https://stackoverflow.com/questions/781 ... a-docker-c

Вернуться в «JAVA»