https://www.iflym.com/index.php/code/use-embeded-tomcat-to-javaee-start-tomcat.html
昨天在網上研究了下關于將tomcat嵌入到主程序中進行運行,而不是像以前將一個web項目copy到tomcat中進行運行。之所以這樣做的原 因,即是因為項目部署到客戶方,在進行更新的時候,需要手動地進行更新,再把相應代碼copy到tomcat,然后再運行。運用embeded tomcat就可以將項目與tomcat分開,在進行更新時,先使用自定義的程序進行自動化更新,待更新完畢之后,再啟動tomcat(或其它 javaee容器)進行項目運行。
這樣做的最終效果就是修改了項目的運行方式。原先的運行方式是以tomcat為中心,由tomcat來啟動和終止項目,現在是由我們的啟動程序 為中心,由啟動程序來負責啟動和終止項目。就相當于現在流行的cs程序一樣,有單獨的啟動腳本,在啟動時進行環境預初始化,更新程序以及其它操作,待完成 之后再進行最終的項目啟動。
這篇主要講解如何使用embeded tomcat在代碼中進行啟動和終止。網上的一般文章均為tomca5.x來做,這里使用了最新的tomcat7,因為tomcat7為embeded開 發,單獨發布了org.apache.tomcat.embed包,以進行獨立的embed開發。以下是相應的maven包
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | < dependency >
< groupId >org.apache.tomcat.embed</ groupId >
< artifactId >tomcat-embed-core</ artifactId >
< version >7.0.2</ version >
</ dependency >
< dependency >
< groupId >org.apache.tomcat</ groupId >
< artifactId >tomcat-util</ artifactId >
< version >7.0.2</ version >
</ dependency >
< dependency >
< groupId >org.apache.tomcat.embed</ groupId >
< artifactId >tomcat-embed-jasper</ artifactId >
< version >7.0.2</ version >
</ dependency >
< dependency >
< groupId >org.apache.tomcat.embed</ groupId >
< artifactId >tomcat-embed-logging-juli</ artifactId >
< version >7.0.2</ version >
</ dependency >
|
使用了embed包中的core包,以及用于編譯jsp的jasper包,然后是工具類以及進行上場記錄的logging-juli包。開始寫代碼:
1 2 3 4 5 6 7 | //設置工作目錄
String catalina_home = "d:/" ;
Tomcat tomcat = new Tomcat();
tomcat.setHostname( "localhost" );
tomcat.setPort(startPort);
//設置工作目錄,其實沒什么用,tomcat需要使用這個目錄進行寫一些東西
tomcat.setBaseDir(catalina_home);
|
上面使用了Tomcat類來進行啟動類,在tomcat7以前均是使用一個叫Embed類來進行啟動,在tomcat7之后,embed類被不建 議使用,而建議使用新的Tomcat類來進行啟動了。然后設置主機名,端口,再設置一個工作目錄。這個工作目錄可以是任意目錄,主要是tomcat需要這 個目錄來記錄一些東西,比如記錄word信息,日志信息(如果配置了日志的話),以及臨時文件存儲等。
1 2 3 4 5 6 7 8 | //設置程序的目錄信息
tomcat.getHost().setAppBase( "e:/" );
// Add AprLifecycleListener
StandardServer server = (StandardServer) tomcat.getServer();
AprLifecycleListener listener = new AprLifecycleListener();
server.addLifecycleListener(listener);
//注冊關閉端口以進行關閉
tomcat.getServer().setPort(shutdownPort);
|
上面的代碼,首先設置我們的項目程序所在的appbase,即放項目代碼的地方。在通常的tomcat配置中,這個目錄一般是webapps。接 著設置一個listener,這個listener主要是負責啟動一些比如html native支持程序以及ipv6等信息配置(可以忽略)。接著是配置一個關閉的注冊端口,當向這個端口發送信息時,就可以達到關閉tomcat的目的 (后面會講)。
1 2 3 4 5 6 7 8 9 | //加載上下文
StandardContext standardContext = new StandardContext();
standardContext.setPath( "/aa" ); //contextPath
standardContext.setDocBase( "aa" ); //文件目錄位置
standardContext.addLifecycleListener( new Tomcat.DefaultWebXmlListener());
//保證已經配置好了。
standardContext.addLifecycleListener( new Tomcat.FixContextListener());
standardContext.setSessionCookieName( "t-session" );
tomcat.getHost().addChild(standardContext);
|
我們單獨使用了一個Context來為這個host添加上下文,tomcat本身提供一個方法tomcat.addWeb方法來添加項目包,不過 由于這里需要單獨設置一個tomcat的sessionName,所以使用與與tomcat.addWeb實現類似的方法來添加一個項目包。
以上代碼中有兩個需要注意的listener,一個是DefaultWebXmlListener,這個是由tomcat加載一些默認的配置信 息,比如jspServlet,以及一些繁復的mime/type信息;加上這個,就不需要我們自己去寫這么多的配置,因為每個項目都需要這些。這個配置 與tomcat目錄下的conf/web.xml中的配置一樣,只不過這里是代碼化了。第二個是FixContextListener,這個主要是在項目 部署完后,將這個上下文設置為configured,表示已經配置好了(不然,tomcat啟動時會報錯,即相應上下文還未配置好)。
配置OK了之后,就是啟動tomcat了:
1 2 | tomcat.start();
tomcat.getServer().await();
|
啟動tomcat,并讓tomcat在關閉端口上監聽。如果沒有最后一句,程序將直接結束,保證監聽之后,tomcat將一直監聽關閉事件,待有關閉事件之后才結束當前程序。所以如果想要關閉當前的tomcat,只需要向關閉端口發送一些信息即可:
1 2 3 4 5 6 7 8 9 | private static void shutdown() throws Exception {
Socket socket = new Socket( "localhost" , shutdownPort);
OutputStream stream = socket.getOutputStream();
for ( int i = 0 ;i < shutdown.length();i++)
stream.write(shutdown.charAt(i));
stream.flush();
stream.close();
socket.close();
}
|
這樣即可達到關閉tomcat的目的。
實際上看整個項目代碼,項目代碼的運行,就是一個配置一個基礎的server.xml(即tomcat目錄下的 conf/server.xml),先配置運行端口,關閉監聽端口;然后配置運行的host以及添加一個上下文context,最后就開始運行并開始監 聽。對照這個程序,再看一下server.xml中的配置信息,就很容易明白以上這段代碼了。
posted on 2016-07-18 14:42
SIMONE 閱讀(4536)
評論(0) 編輯 收藏 所屬分類:
JAVA 、
tomcat