Я не знаю, есть ли способ получить объект контекста таймера, но у меня есть другая идея. Вы сказали, что этот метод вызывается не так часто. Почему бы не использовать DynamicFeature и не печатать время выполнения контейнера?
Ниже я покажу вам, как это можно реализовать. Я не уверен, работает ли это, я просто закодировал его без каких-либо тестов, поэтому, пожалуйста, попробуйте и измените его, если это необходимо. Если ExecutionTimeFilter нуждается в разделении на два отдельных класса из-за реализованных интерфейсов, измените его соответствующим образом.
Шаг 1. Создайте фильтр
@Provider
public class ExecutionTimeFilter implements ContainerRequestFilter, ContainerResponseFilter {
public static final String EXECUTION_TIME_HEADER = "X-Execution-Time";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add(EXECUTION_TIME_HEADER, ZonedDateTime.now().toString());
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
ZonedDateTime executionStartHeader = ZonedDateTime.parse(requestContext.getHeaderString(EXECUTION_TIME_HEADER));
Duration executionTime = Duration.between(executionStartHeader, ZonedDateTime.now());
//you can also print some url informations or whatever you need; check out the informations from both mehtod params
System.out.println("The execution time was:" + executionTime);
}
}
Шаг 2. Создайте DynamicFeature
@Provider
public class ExecutionTimeFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
if (resourceInfo.getResourceMethod().getAnnotation(ExecutionTime.class) != null) {
context.register(ExecutionTimeFilter.class);
}
}
}
Шаг 3. Создайте аннотацию
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecutionTime {
}
Шаг 4. Аннотируйте свой ресурс
@GET
@ExecutionTime
public String getExcpensiveCalculation(@QueryParam("number") @DefaultValue("1") IntegerParam number) {
return getCalculation(number);
}
Шаг 5. Зарегистрируйте функцию
environment.jersey().register(ExecutionTimeFeature.class);
Ссылки:Динамическая функция Dropwizard с фильтрами
person
hiaclibe
schedule
29.08.2016