編寫(xiě) Tomcat 管理程序
作者:jilili 瀏覽次數(shù):439 創(chuàng)建于: 2006-01-03 更新于: 2006-11-19
關(guān)鍵字:
1.前言
基于Tomcat的應(yīng)用程序在發(fā)布時(shí)總是存在啟動(dòng)服務(wù)和重新加載的問(wèn)題,有時(shí)甚至需要重新啟動(dòng)Tomcat服務(wù),經(jīng)過(guò)一段時(shí)間的使用對(duì)Tomcat有了些了解,這篇文章的目的是介紹有關(guān)怎樣通過(guò)程序去控制Tomcat,主要內(nèi)容如下:
添加刪除虛擬主機(jī)、添加刪除Host別名、啟動(dòng)停止Host、啟動(dòng)停止Context、發(fā)布卸載程序
2. 準(zhǔn)備知識(shí)和參考資料
2.1 類加載器和Tomcat安全管理(可以在讀完整篇文章后作為補(bǔ)充材料閱讀)
類裝入問(wèn)題解密(http://www-128.ibm.com/developerworks/cn/java/j-dclp1/)
了解 Java ClassLoader(http://www- 128.ibm.com/developerworks/cn/views/java/tutorials.jsp?cv_doc_id=84959)這篇文章需要注冊(cè)才能看到
Java 編程的動(dòng)態(tài)性,第 1 部分: 類和類裝入(http://www-128.ibm.com/developerworks/cn/java/j-dyn0429/)
The Tomcat 5.5 Servlet/JSP Container Class LoaderHOW-TO(http://tomcat.apache.org/tomcat-5.5-doc/class-loader- howto.html)
The Tomcat 5.5 Servlet/JSP Container Security Manager HOW-TO(http://tomcat.apache.org/tomcat-5.5-doc/security-manager- howto.html)
2.2 ContainerServlet
org.apache.catalina.ContainerServlet 是一個(gè)接口類,它可以訪問(wèn)Catalina的內(nèi)部功能,它有Catalina被類加載器加載,而不是我們的WebApplication類加載器。它的Setter方法在這個(gè)Servlet的新的實(shí)例被放進(jìn)Service時(shí)被執(zhí)行。
我們使用它獲取 Engine, Host, Context等內(nèi)部對(duì)象。要使用這個(gè)類必需在Context配置中使 privileged="true"如下:
<Context docBase="/opt/vhost/ideais.net/tomcat.war" path="/tomcat" privileged="true"/>
2.3 JMX
Tomcat5.X中提供了JMX對(duì)象,它對(duì)于Tomcat的管理提供了完整的管理,可是對(duì)于服務(wù)的控制只有通過(guò)借用ContainerServlet來(lái)實(shí)現(xiàn)。
3. Tomcat 層次結(jié)構(gòu)

4. 獲取Tomcat內(nèi)部對(duì)象
...
import org.apache.catalina.*;
...
public class XmlAdminServlet extends HttpServlet implements ContainerServlet
...
protected Wrapper wrapper = null;
protected Context context = null;
protected Host host = null;
...
public void setWrapper(Wrapper wrapper) {
this.wrapper = wrapper;
if (wrapper == null) {
context = null;
host = null;
engine = null;
} else {
context = (Context) wrapper.getParent();
host = (Host) context.getParent();
engine = (Engine) host.getParent();
}
}
...
Container[] hosts = engine.findChildren();
...
}
</script>