Плетение времени загрузки в Spring Framework не регистрируется должным образом

Является ли Load time Weaving (LTW) хорошим выбором для приложения корпоративного уровня с JSF в качестве пользовательского интерфейса и содержит более 6000 классов? Показатели производительности должны генерироваться для всего приложения, но они не могут генерироваться для управляемого компонента JSF, такого как LoginMBean. Однако @Component существует, так что возможно ли, что он может работать с AspectJ (LTW)? Добавлен файл aop.xml, а также путь aspectJWeaver к аргументам vm.

<aspectj>
    <weaver
    options=" -verbose -showWeaveInfo -Xset:weaveJavaxPackages=true -Xreweavable">
        <include within="com.x.login..*" />
        <include within="com.x.aspects.Aspect" />
    </weaver>
    <aspects>
        <aspect name="com.x.aspects.Aspect" />   
    </aspects>
</aspectj
package com.x.login;

@Component
@Scope("session")
public class LoginMBean extends AbstractMbean {
    @Autowired
    LoginService loginService ;

    public void loginUserData(){
    LoginInfo info= new LoginInfo();
    //setter for info object
    //some nested method calls
    loginService.insertLoginData(info);

   }
}
package com.x.login.service.impl;

@Service("LoginService")
public class LoginServiceImpl implements LoginService{
    @Autowired
    GenericCrudService  genericCrudService ;

    public void insertLoginData(LoginInfo info){
      //some nested method calls
      try{
        genericCrudService.saveEntity(info);
      }catch(Exception e){
      //log exception
      }
    }        

}
package com.x.aspect.config;

@Configuration
@ComponentScan(basePackages = { "com.x" })
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
public class AspectConfig {


}

package com.x.aspects; 

@Component 
@Aspect
public class Aspects {
    private static Logger Logger= LoggerFactory.getLogger(Aspects.class);

    @Pointcut("execution(* *(..)) && cflow(execution(* com.x.login..*(..)))")
    public void methodsToBeProfiled() {}

    @Around("methodsToBeProfiled()")
    public Object methodsToBeProfiled(ProceedingJoinPoint point) throws Throwable {
        StopWatch sw = new StopWatch(getClass().getSimpleName());
        try {
            sw.start(point.getSignature().getName());
            return point.proceed();
        } finally {
            sw.stop();
            Logger.info("Elapsed Time, Package Name, Method Name");
            Logger.info(sw.prettyPrint());
            Logger.info("Package Name: " + point.getStaticPart());
        }
    }
}

Журнал AspectJ:


[ParallelWebappClassLoader@17c8dbdf] info register aspect com.x.aspects.Aspects
[ParallelWebappClassLoader@17c8dbdf] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[ParallelWebappClassLoader@17c8dbdf] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[ParallelWebappClassLoader@5e68f202] weaveinfo Join point 'method-execution(void com.x.aspects.Aspects.methodsToBeProfiled())' in Type 'com.x.aspects.Aspects' (Aspects.java:36) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@5e68f202] weaveinfo Join point 'method-execution(java.lang.String com.x.login.PSMVProperties.getMultiDb())' in Type 'com.x.login.PSMVProperties' (PSMVProperties.java:27) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@5e68f202] weaveinfo Join point 'method-execution(void com.x.login.MultiDatabase.loadAEFormRestrictions(com.x.qnccore.service.GenericCrudService, java.lang.String, org.springframework.web.context.WebApplicationContext))' in Type 'com.x.login.MultiDatabase' (MultiDatabase.java:275) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@5e68f202] weaveinfo Join point 'method-execution(void com.x.login.QuestionMBean.setRecordLock(boolean))' in Type 'com.x.login.QuestionMBean' (QuestionMBean.java:146) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@5e68f202] weaveinfo Join point 'method-execution(java.lang.String com.x.login.RequestPojo.getTenantid())' in Type 'com.x.login.RequestPojo' (RequestPojo.java:18) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@5e68f202] weaveinfo Join point 'method-execution(void com.x.login.RequestPojo.setTenantid(java.lang.String))' in Type 'com.x.login.RequestPojo' (RequestPojo.java:23) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@17c8dbdf] weaveinfo Join point 'method-execution(void com.x.login.service.impl.LoginServiceImpl.insertLoginData(com.x.agx.admin.bus.entity.LoginInfo))' in Type 'com.x.login.service.impl.LoginServiceImpl' (LoginServiceImpl.java:427) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]
[ParallelWebappClassLoader@17c8dbdf] weaveinfo Join point 'method-execution(java.util.List com.x.login.service.impl.LoginServiceImpl.getFailedLoginAttemptUsingIp(java.util.HashMap))' in Type 'com.x.login.service.impl.LoginServiceImpl' (LoginServiceImpl.java:442) advised by around advice from 'com.x.aspects.Aspects' (Aspects.java) [with runtime test]

spring-config.xml

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<context:load-time-weaver aspectj-weaving="on" />

Журнал метрик

ms     %     Task name
-----------------------------------------
00003  100%  insertLoginData

2019-07-30 15:14:19,550 INFO c.a.a.Aspects [http-nio-8080-exec-10] Package Name: execution(void com.x.login.service.impl.LoginServiceImpl.insertLoginData(LoginInfo))
2019-07-30 15:14:19,554 INFO c.a.a.Aspects [http-nio-8080-exec-10] Elapsed Time, Package Name, Method Name
2019-07-30 15:14:19,555 INFO c.a.a.Aspects [http-nio-8080-exec-10] StopWatch 'Aspects': running time (millis) = 4

LoginMBean управляется jsf для login.xhtml. Это проблема JSF или из-за неправильного pointcut? LoginMBean не появляется в тканых классах. Пожалуйста, помогите, что не так выше. Я не могу получить показатели производительности для любого метода в классе LoginMBean.


person shubhra thakur    schedule 29.07.2019    source источник
comment
Журналы для LoginServiceImpl генерируются, но не генерируются для LoginMBean. Таким образом, для уровня обслуживания работает pointcut. но не для LoginMBean. и в aop.xml ‹include внутри=com.x.aspects.Aspects /›   -  person shubhra thakur    schedule 29.07.2019
comment
Привет. Я позволил себе разделить вашу смесь кода на более мелкие фрагменты (по одному на класс), исправить отступы, добавить подсветку синтаксиса и переупорядочить pointcut в аспекте, предшествующем методу совета, использующему его. Все это делает код немного более читаемым, но что касается вашего вопроса, мне трудно понять проблему, особенно потому, что ваш pointcut чувствителен к имени пакета, но вы не указываете имена пакетов в своем коде. Кроме того, у вас нет общих вызовов кода и методов, которые вы хотите перехватить, поэтому я не понимаю, почему вы используете cflow().   -  person kriegaex    schedule 29.07.2019
comment
И последнее, но не менее важное: вы говорите, что хотите использовать AspectJ с LTW. Если это так, аспекты должны работать независимо от каких-либо компонентов Spring для любого типа POJO. Если вы используете Spring AOP, он действительно работает только для компонентов Spring, но в этом случае cflow() не будет работать, потому что его поддерживает только AspectJ. Возможно, вы можете отредактировать свой вопрос, объяснить больше и показать больше кода. Пожалуйста, не добавляйте важную информацию в комментарии, обновите вопрос, а затем сообщите мне об обновлении в комментарии.   -  person kriegaex    schedule 29.07.2019
comment
Что именно было непонятно в том, что я просил вас отредактировать ваш вопрос вместо того, чтобы комментировать? Образец исправления, сделанный в комментарии, не виден при чтении вопроса. Пожалуйста, переместите всю информацию из ваших комментариев в вопрос и удалите комментарии. В общем, пусть ваш код говорит, в идеале предоставьте MCVE, чтобы сделать вашу проблему воспроизводимой. К сожалению, из вашей прозы я не могу получить всю информацию, которая мне нужна, чтобы помочь вам. Вы даже не ответили на мой вопрос о названиях пакетов.   -  person kriegaex    schedule 30.07.2019
comment
Еще вопрос: Вы добавили вивер вариант -showWeaveInfo. Не могли бы вы проверить, действительно ли был создан ваш класс LoginMBean? Вы также можете опубликовать вывод журнала AspectJ weaver здесь, отредактировав свой вопрос.   -  person kriegaex    schedule 30.07.2019
comment
добавлен лог-файл аспекта. spring-config для классов, использующих конфигурацию xml, и @EnableLoadTimeWeaving для остальных классов, использующих аннотации.   -  person shubhra thakur    schedule 30.07.2019
comment
cflow() я использовал для вызова вложенных методов.   -  person shubhra thakur    schedule 30.07.2019


Ответы (1)


Глядя на ваш журнал, похоже, что LoginMBean не подвергается воздействию ткача AspectJ. По крайней мере я не вижу никаких weaveinfo ... in Type 'com.x.login.LoginMBean'. Так

  • либо класс загружается и сплетается позже (вы можете просмотреть свой журнал для weaveinfo.*LoginMBean дальше по журналу после того, как убедитесь, что класс был загружен и использован JSF)
  • либо вообще не плетётся (если не найдёте такой записи в логе). Тогда у вас возникла проблема с загрузчиком классов, то есть каким-то образом агент плетения AspectJ не был зарегистрирован в загрузчике классов, ответственном за загрузку LoginMBean. Тогда было бы интересно узнать, какой сервер приложений вы используете и как выглядит ваша командная строка JVM (должно быть что-то с -javaagent:....

Пожалуйста, следите за этим ответом, комментируя или обновляя свой вопрос, добавляя дополнительную информацию. В идеале создайте и опубликуйте MCVE на GitHub.

person kriegaex    schedule 30.07.2019
comment
LoginMBean вообще не вплетен. Я использую Apache Tomcat 8.5, а аргументы vm: Djavaagent=D:\Maven_Repository\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar - person shubhra thakur; 31.07.2019
comment
Имеет ли значение, что bean-компонент относится к области сеанса или является синглтоном для работы AspectJ (LTW)? Можете ли вы предложить какой-нибудь лучший способ создания показателей производительности для большого приложения, а не только для методов уровня интерфейса, но и для вызовов вложенных методов? предположим, что у нас есть около 7000 классов внутри пакета, тогда pointcut на уровне пакета сначала загрузит все это, и это займет много времени. - person shubhra thakur; 31.07.2019
comment
AspectJ не заботится о вашей области действия bean-компонента, он ничего о ней не знает. Важно то, что агент ткачества загружается перед всеми соответствующими загрузчиками классов, чтобы иметь возможность декорировать их с помощью функциональности плетения. Возможно, вы можете попробовать поместить его в путь к классам загрузки. Без MCVE это действительно просто предположение. Если вы хотите избежать медленного запуска, используйте плагин AspectJ Maven и выполняйте переплетение во время компиляции. - person kriegaex; 01.08.2019
comment
Лучшей благодарностью будет описание того, что вы сделали, и если/как ваша проблема была решена. Вы все еще не приняли и не проголосовали за мой ответ, так что есть ли еще какие-то проблемы? - person kriegaex; 01.08.2019
comment
это полезно, однако я думаю, что проблема вовсе не в Аспектах, поскольку журналы уровня обслуживания я получаю полностью. Я думаю переключиться на время компиляции, так как LoginMBean все еще не загружен. Так как приложение очень большое, это может быть проблема с каким-то кодом или потоком. Я до сих пор не понял, буду обновлять, если найду какое-либо решение. - person shubhra thakur; 01.08.2019
comment
Я опубликую MCVE на Github. Как я застрял - person shubhra thakur; 01.08.2019