jetty的StatisticsHandler类可以让我们统计到:
1、所有请求数
2、当前活动请求数
3、最大活动请求数
4、最大请求处理时间
5、返回码为4XX,5XX的请求数等
这些有助于我们分析jetty运行状况,但是查看StatisticsHandler的这些统计有点麻烦,通过派生StatisticsHandler类可以很容易做到这点:
package stat;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mortbay.jetty.handler.StatisticsHandler;
public class RequestStat extends StatisticsHandler {
private Thread t = new Thread() {
@Override
public void run() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (true) {
try {
sleep(20000);
} catch (Exception e) {
}
System.out.println(df.format(new Date()) + " act:" + RequestStat.this.getRequestsActive()
+ ", requests:" + RequestStat.this.getRequests()
+ ", actMas:" + RequestStat.this.getRequestsActiveMax()
+ ", curReqs.size:" + RequestStat.this.curReqs.size()
+ ", curReqs:" + RequestStat.this.curReqs);
}
}
};
public RequestStat() {
t.setDaemon(true);
t.start();
}
Map<Thread, String> curReqs = new ConcurrentHashMap<Thread, String>();
public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException {
try {
synchronized(this) {
curReqs.put(Thread.currentThread(), request.getRequestURI() + "?" + request.getQueryString()); }
super.handle(target, request, response, dispatch);
}
finally {
synchronized(this) {
curReqs.remove(Thread.currentThread());
}
}
}
}
将上面的class打成jar包放到jetty/lib目录中
jetty.xml里加上如下:
<Set name="handler">
<New class="stat.RequestStat">
<Set name="handler">
<New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.mortbay.jetty.Handler">
<Item>
<New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/>
</Item>
<Item>
<New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/>
</Item>
<Item>
<New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/>
</Item>
</Array>
</Set>
</New>
</Set>
</New>
</Set>
重启jetty,这样在jetty stderrout.log日志中就可以看到输出的统计信息