Поскольку вы реализуете как ContainerRequestFilter
, так и ContainerResponseFilter
в одном классе, создается впечатление, что создаются 2 разных экземпляра, поэтому переменная requestStartTime
различается между двумя экземплярами.
Эта проблема сообщалось о проекте Eclipse Jersey и считалось ошибкой, которая была решена, см. https://github.com/eclipse-ee4j/jersey/issues/3796.
Здесь все обсуждение: https://github.com/eclipse-ee4j/jaxrs-api/issues/605.
Аргументом было то, что такое поведение не соответствует спецификации JAX-RS (раздел 4.1):
По умолчанию для каждого приложения JAX-RS создается отдельный экземпляр каждого класса провайдера.
Но Quarkus использует RESTEasy, поэтому я предполагаю, что он не содержит этого исправления.
В любом случае, даже если был создан единственный экземпляр (например, с использованием аннотации @Singleton
), вам по-прежнему не следует использовать переменную экземпляра для сохранения времени начала, поскольку одновременные запросы будут переопределять его (спасибо @areus за указание на это).
Вместо этого вы можете сохранить время запуска в свойствах ContainerRequestContext
на ContainerRequestFilter.filter()
, а затем получить его и использовать на ContainerResponseFilter.filter()
:
@Provider
public class RequestLogFilter implements ContainerRequestFilter, ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext) {
long requestStartTime = System.nanoTime();
requestContext.setProperty("requestStartTime", requestStartTime);
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
long requestStartTime = (long) requestContext.getProperty("requestStartTime");
long requestFinishTime = System.nanoTime();
long duration = requestFinishTime - requestStartTime;
System.out.println("duration: " + TimeUnit.NANOSECONDS.toMillis(duration) + " ms");
}
}