我不知道是否有办法获取计时器上下文对象,但我有另一个想法。你说这个方法不太经常被调用。为什么不使用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());
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 {
}
步骤四:为您的资源添加注释
@GET
@ExecutionTime
public String getExcpensiveCalculation(@QueryParam("number") @DefaultValue("1") IntegerParam number) {
return getCalculation(number);
}
步骤五:注册功能
environment.jersey().register(ExecutionTimeFeature.class)
参考资料:使用过滤器的Dropwizard动态功能