>

로드 타임 위빙 (LTW)은 JSF를 사용자 인터페이스로 사용하고 6k + 클래스를 포함하는 엔터프라이즈 레벨 애플리케이션에 적합한 선택입니까?     전체 애플리케이션에 대해 성능 지표를 생성해야하지만 LoginMBean과 같은 JSF 관리 Bean에 대해서는 생성 할 수 없습니다. 그러나 @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 로그 :


[[email protected]] info register aspect com.x.aspects.Aspects
[[email protected]] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[[email protected]] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[[email protected]] 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]
[[email protected]] 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]
[[email protected]] 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]
[[email protected]] 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]
[[email protected]] 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]
[[email protected]] 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]
[[email protected]] 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]
[[email protected]] 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은 login.xhtml에 대해 jsf 관리됩니다. JSF 문제입니까, 아니면 잘못된 pointcut 때문입니까? LoginMBean은 짠 클래스에는 나타나지 않습니다. 위의 문제를 도와주세요. LoginMBean 클래스의 모든 메소드에 대한 성능 메트릭.

  • 답변 # 1

    로그를 보면 LoginMBean 처럼 보입니다.  AspectJ 위버에 노출되지 않습니다. 적어도 나는 어떤 weaveinfo ... in Type 'com.x.login.LoginMBean' 도 보지 못한다 . 그래서

    클래스 중 하나를로드하고 나중에 짠다 ( weaveinfo.*LoginMBean 에 대한 로그를 잡을 수 있음)  JSF가 클래스를로드하고 사용했는지 확인한 후 로그를 더 아래로 내리십시오)

    또는 전혀 짠 것이 아닙니다 (그런 로그 항목을 찾지 못한 경우). 그런 다음 클래스 로더 문제가 있습니다. 즉, 어떻게 든 AspectJ 직조 에이전트가 LoginMBean 로드를 담당하는 클래스 로더에 등록되지 않았습니다 . 그런 다음 사용중인 응용 프로그램 서버와 명령 JVM 행이 어떻게 보이는지 아는 것이 흥미로울 것입니다 ( -javaagent:... 와 관련이 있어야 함) .

    댓글을 달거나 추가 정보로 질문을 업데이트하여이 답변에 대해 후속 조치를 취하십시오.

관련 자료

  • 이전 python - pyhton 클래스 함수에서 'str'객체를 호출 할 수 없음
  • 다음 angular를 사용하여 Java에서 파일 CSV를 수신하는 방법