Java 确定Jersey RequestEventListener中的请求/响应大小度量
我们希望测量API端点的请求和响应大小。由于需要使用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
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
类。所以如果你用番石榴,你也可以用它