Как перехватить вложенный метод в Java EE - PullRequest
0 голосов
/ 28 декабря 2018

ПРОБЛЕМА: необходимо регистрировать время каждого отдельного выполнения каждого указанного метода.

ИССЛЕДОВАНИЕ: пробная Intellij Idea плагины профилирования .Некоторые не работают, некоторые дорогие.Некоторые излишни.

В коде это может быть легко достигнуто в начале и конце тела метода или как вызовы некоторого общего класса.

Более аккуратный подход заключается в использовании перехватчиков (с объявленными классами перехватчиков или даже посредством пользовательской аннотации привязки перехватчика).Но только метод ввода класса перехватывается (даже в случае аннотации метода intersoptors), тогда как мне нужны более глубокие (вложенные).

Класс бина:

@Stateless
@LocalBean
@Interceptors({ProfilerInterceptor.class, LoggingInterceptor.class})
public class ComparisonService {

  @Interceptors({ProfilerInterceptor.class})
  public method aMethod(){

    bMethod();
  }

  @Interceptors({ProfilerInterceptor.class})
  public method bMethod(){

    // Logics for time-measurement.
  }
}

Класс перехватчика:

@Interceptor
@Profiled
public class ProfilerInterceptor {

  @Inject private Logger logger;

  private Object returnedValue;

  @AroundInvoke
  public Object measureExecutionTime(InvocationContext context) throws Exception {

    LocalDateTime start = LocalDateTime.now();

    try {

      returnedValue = context.proceed();

      return returnedValue;

    } finally {

    LocalDateTime end = LocalDateTime.now();
    long difference = Duration.between(start, end).toMillis();

    logger.info(          
 "\n************************************************************************\n"
          + context.getMethod().getName()
          + "() - "
          + difference
          + " мс");
    }
  }
}

XML-дескриптор бина:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  bean-discovery-mode="all"
  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">
  <interceptors>
    <class>my.package.LoggerInterceptor</class>
    <class>my.package.ProfilerInterceptor</class>
  </interceptors>
</beans>

ВОПРОС: Как перехватить вложенный метод или реализовать тип шаблона декоратора (оболочки) для методауровень

...