Java 确定Jersey RequestEventListener中的请求/响应大小度量

Java 确定Jersey RequestEventListener中的请求/响应大小度量,java,jax-rs,jersey-2.0,Java,Jax Rs,Jersey 2.0,我们希望测量API端点的请求和响应大小。由于需要使用RequestEventListener确定持续时间,我们采用了这种方法 使用inspector,我们可以看到requestEvent包含一个属性containerResponse.messageContext.commitingOutputStream.adoptedOutput.delegate.outputStream.count,它包含以字节为单位的实际响应大小。但是,我们无法使用公共方法和字段访问此字段。可访问的方法container

我们希望测量API端点的请求和响应大小。由于需要使用
RequestEventListener
确定持续时间,我们采用了这种方法

使用inspector,我们可以看到requestEvent包含一个属性
containerResponse.messageContext.commitingOutputStream.adoptedOutput.delegate.outputStream.count
,它包含以字节为单位的实际响应大小。但是,我们无法使用公共方法和字段访问此字段。可访问的方法
containerResponse.getLength()
总是返回
-1
。对于
containerRequest.getLength()
也一样

我们如何访问实际的请求和响应大小,最好不进行反射

private class EndPointPerformanceFilter implements RequestEventListener {
    private long start;

    @Override
    public void onEvent(final RequestEvent requestEvent) {
        switch (requestEvent.getType()) {
            case START:
                start = timeProvider.currentTimeMillis();
                break;
            case FINISHED:
                final long duration = timeProvider.currentTimeMillis() - start;

                final ContainerRequest containerRequest = requestEvent.getContainerRequest();
                final ContainerResponse containerResponse = requestEvent.getContainerResponse();

                System.out.println("Req: [" + containerRequest.getLength() + "] Rep: [" + containerResponse.getLength() +"]");
                break;
        }
    }
}

我以前也试过做同样的事情。我从未找到直接从泽西岛获取数据的解决方案。我刚刚实现了一个
writerienterceptor
,在这里我将
OutputStream
设置为apachecommons'。然后,在作者写完之后,他得到了计数

我手头上没有确切的实现,但复制功能时,基本上是这样的

@Provider
public class ContentLengthLoggingProvider implements ReaderInterceptor, WriterInterceptor {

    private static final Logger logger = Logger.getLogger(ContentLengthLoggingProvider.class.getName());
    private static final String REQUEST_LENGTH_PROPERTY = "Request.Content.Length";

    @Override
    public void aroundWriteTo(WriterInterceptorContext writerContext) 
            throws IOException, WebApplicationException {

        CountingOutputStream outputStream 
                = new CountingOutputStream(writerContext.getOutputStream());
        writerContext.setOutputStream(outputStream);

        writerContext.proceed();

        long responseCount = outputStream.getCount();
        String requestCount = (String)writerContext.getProperty(REQUEST_LENGTH_PROPERTY);
        String log = "Req: [" + requestCount + "] Rep: [" + responseCount +"]";
        logger.info(log);
    }

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext readerContext) 
            throws IOException, WebApplicationException {
        String requestLength = readerContext.getHeaders().getFirst(HttpHeaders.CONTENT_LENGTH);
        readerContext.setProperty(REQUEST_LENGTH_PROPERTY, requestLength);
        return readerContext.proceed();
    }  
}
这是我使用的依赖项

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

公地io
公地io
2.4
我认为番石榴有一个类似的
CountingOutputStream
类。所以如果你用番石榴,你也可以用它