Почему я не могу обернуть выполнение запроса советом @Around?
Я работаю над REST API и хотел бы провести очень простые тесты, чтобы узнать, сколько времени занимает обработка запроса.
Я мог бы сделать это с помощью завитка, но я хотел бы только время приложения (а не задержку, сеть и т. д.).
Я выбрал AspectJ для этого. Я уверен, что есть и другие инструменты, но я выбрал AspectJ, чтобы узнать что-то новое.
Первый; приведенный ниже фрагмент кода работает. То
beforeAdvice
и
afterAdvice
работает нормально и выводит время выполнения.
@Configuration
public class AOPConfig {
@Aspect
@Component
public class ResourceAspect {
@Before(value = "execution(public * com.example.api.web.resource..*.*(..))")
public void beforeAdvice(JoinPoint joinPoint) {
System.setProperty("now", System.currentTimeMillis() + "");
}
@After(value = "execution(public * com.example.api.web.resource..*.*(..))")
public void afterAdvice(JoinPoint joinPoint) {
long then = Long.parseLong(System.getProperty("now"));
System.out.println(System.currentTimeMillis() - then);
}
}
}
Теперь я хотел бы подключиться к обработке запросов как можно раньше. Итак, я решил, что могу обернуть выполнение:
-
org.apache.coyote.http11.Http11Processor.process()
или -
org.apache.catalina.connector.CoyoteAdapter.service()
Ниже не работает (ничего не печатается):
@Configuration
public class AOPConfig {
@Aspect
@Component
public class ResourceAspect {
//@Around(value = "execution(public * org.apache.coyote.http11.Http11Processor.process(..))")
@Around(value = "execution(* org.apache.catalina.connector.CoyoteAdapter.service(..))")
public Object around(final ProceedingJoinPoint joinPoint) throws Throwable {
try {
System.out.println("BEGIN");
return joinPoint.proceed();
} finally {
System.out.println("END");
}
}
}
Глядя на эту трассировку стека, я подумал, что могу обернуть либо
Http11Processor
или
CoyoteAdapter
с участием .
Есть ли ограничение на классы, с которыми я могу работать, или есть что-то еще, чего мне не хватает, чтобы получить
@Around
совет выше для работы?