Jetty內部只有一個線程池負責NIO事件,業務事件的執行,因此在做壓力測試的時候,如何簡單知道當前這個線程池運行狀態對于系統調優來說很重要,其實Jetty主框架是配置代替編碼的模式,因此你只需要配置一下,就可以獲得Jetty內部任何數據。
先看看配置:
當前丟在了jetty-deploy.xml中,其實完全可以自己去寫一個xml分離開來:
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Configure the deployment manager -->
<!-- -->
<!-- Sets up 2 monitored dir app providers that are configured -->
<!-- to behave in a similaraly to the legacy ContextDeployer -->
<!-- and WebAppDeployer from previous versions of Jetty. -->
<!-- =========================================================== -->
<Call name="addBean">
<Arg>
<New class="com.taobao.top.xbox.util.JettyThreadPoolInspector">
<Set name="server">
<Ref id="Server" />
</Set>
<Set name="interval">5</Set>
</New>
</Arg>
</Call>
......
</Configure>
看看下面這段簡單的代碼,就知道如何輸出jetty內部的線程了:
/**
* @author fangweng
* @email fangweng@taobao.com
* @date 2011-6-22
*
*/
public class JettyThreadPoolInspector implements LifeCycle,Runnable{
private static final Log logger = LogFactory.getLog(JettyThreadPoolInspector.class);
Server server;
int interval = 10 * 60;//每隔多少時間輸出隊列信息
Thread innerThread;
boolean flag = true;
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public Server getServer() {
return server;
}
public void setServer(Server server) {
this.server = server;
}
public void run()
{
while(flag)
{
try
{
logger.warn(new StringBuilder().append("Jetty Thread Pool: ").
append(server.getThreadPool().toString()).toString());
Thread.sleep(interval * 1000);
}
catch(Exception ex)
{
logger.error(ex);
}
}
}
@Override
public void start() throws Exception {
innerThread = new Thread(this,"JettyThreadPoolInspector-thread");
innerThread.start();
}
@Override
public void stop() throws Exception {
this.flag = false;
innerThread.interrupt();
}
......
至此為止,其實想說明的就是Jetty內部透明很容易做到,隨意可植入,如果不喜歡循環輸出,都可以實現監聽kill -3的模式來dump出關心的信息。