타이머 컨텍스트 개체를 가져 오는 방법이 있는지 모르겠지만 다른 아이디어가 있습니다. 당신은이 방법이 그렇게 자주 전화하지 않는다고 말했다. 왜 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 Dynamic Feature with Filters