有没有办法测量Java(Servlet)I / O流量?

时间:2010-11-12 18:01:08

标签: java http servlets servlet-filters

我尝试做的是使用这样的代码实现servlet过滤器:

int up = request.getContentLength();
if ( ( (HttpServletRequest) request ).getQueryString() != null )
  {
  up = Math.max( up, ( (HttpServletRequest) request ).getQueryString().length() ) ;
  }
int down = ( (HttpServletResponse) response ).getBufferSize();

processIO( up, down );

但是,虽然up vaue基本上没问题,但每次请求的下限值都是8192。

任何提示赞赏, RO

4 个答案:

答案 0 :(得分:2)

在处理请求之前和之后发生过滤:Is doFilter() executed before or after the Servlet's work is done?

您必须在int down = ...之前添加类似的内容:

filterChain.doFilter(request, response);

这将调用产生回复的servlet(和其他过滤器)。只有这样你才能检查回复,看看它的大小。

此外,您总是得到8192,因为您要求的是缓冲区大小,而不是回复的大小。

以下是记录所有请求和响应的示例DumpFilter。您可以将其修剪为仅记录请求和响应长度。

答案 1 :(得分:1)

getBufferSize()

  

返回使用的实际缓冲区大小   为了回应。如果没有缓冲   使用时,此方法返回0.

当然,缓冲区永远不会改变!你想要的是获得响应然后做大小。不幸的是,你不能只用HttpServletResponse做到这一点。但是您可以实现自己的ServletResponse和getContentLength。确保在doFilter调用后执行此操作。

修改

好的,我现在找不到一个好的例子,但这里有一个摘要你能做什么。使用wrapper实现您自己的响应,然后对于getOutputStream,您可以返回您的实现。在过滤器的末尾,只需获取流的大小。

答案 2 :(得分:0)

getBufferSize返回缓冲区大小,读取the API doc。我想,您可以计算代码中的下行流量。只需在写入servlet输出流时递增计数器。

答案 3 :(得分:0)

您可以包装请求和响应,并相应地返回包装的输入和输出流。在这些包装的流中,您可以跟踪已读取和写入的字节数。

这样,它不仅适用于内存缓冲区,还适用于大量输入和输出流请求。