将Tomcat嵌入到自己的应用中

查看原文请移步《http://www.yshjava.cn/post/418.html

 

TomcatApache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成,是目前比较流行的Web 应用服务器。

Tomcat运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能而广受广大程序员的喜欢。Tomcat不仅有独立运行的版本,而且还提供了可以内嵌到JavaEE应用中的Embedded版本,这一点非常实用!

将Tomcat服务器嵌入到自己的应用中,不仅可以大幅缩短搭建Web服务器所消耗的时间,还可以深度控制Tomcat,从而更好地为应用服务器。
下面就以Tomcat6为例,以具体代码方式展示如何将Tomcat服务器嵌入到自己的应用中。

package cn.ysh.studio.tomcat;

import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.catalina.*;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.realm.MemoryRealm;
import org.apache.catalina.startup.Embedded;

/**
 * 以内嵌的方式启动tomcat服务器
 * 
 * @author www.yshjava.cn
 * 
 */
public class EmbeddedTomcat {

	private EmbeddedTomcat(Embedded tomcat, String listenIP, int listenPort) {
		this.tomcat = tomcat;
		this.listenIP = listenIP;
		this.listenPort = listenPort;
	}

	public static EmbeddedTomcat startup(String catalinaHome, String warFileName, int listenPort, boolean enableRemoteAccess) {
		System.setProperty("catalina.home", catalinaHome);
		// 监听IP获取
		String listenIP;
		try {
			listenIP = (enableRemoteAccess ? InetAddress.getLocalHost().getHostAddress() : "127.0.0.1");
		} catch (UnknownHostException e) {
			throw new RuntimeException(e);
		}
		// war 文件检测
		String contextName;
		int tn = warFileName.lastIndexOf("//");
		if (tn < 0) {
			contextName = warFileName;
			warFileName = catalinaHome + "/webapps/" + warFileName;
		} else {
			contextName = warFileName.substring(tn + 1);
		}
		File warFile = new File(warFileName);
		if (!warFile.exists())
			throw new RuntimeException("File '" + warFileName + "' does'nt exist.");
		if (warFileName.endsWith(".war")) {
			contextName = contextName.substring(0, contextName.lastIndexOf('.'));
		} else {
			if (!warFile.isDirectory()){
				throw new RuntimeException("File '" + warFileName + "' must be a .war file or a folder.");
			}
		}
		//创建一个内嵌的Tomcat服务器
		Embedded tomcat = new Embedded();
		//设置Tomcat的工作目录
		tomcat.setCatalinaHome(catalinaHome);
		// set the memory realm
		MemoryRealm memRealm = new MemoryRealm();
		tomcat.setRealm(memRealm);
		// 创建Tomcat引擎
		Engine engine = tomcat.createEngine();
		//设置默认的虚拟主机
		engine.setDefaultHost("localhost");
		engine.setName("MyEngine");
		//创建虚拟主机
		Host host = tomcat.createHost("localhost", catalinaHome + "/webapps");
		//把Host加入Engine
		engine.addChild(host);
		/*
		 * Create the ROOT context Context rootContext =
		 * tomcat.createContext("", catalinaHome + "/webapps/ROOT");
		 * rootContext.setReloadable(false);
		 * rootContext.addWelcomeFile("index.jsp"); host.addChild(rootContext);
		 */
		Context myContext = tomcat.createContext("/" + contextName, warFileName);
		myContext.setPrivileged(true);
		host.addChild(myContext);
		// Install the assembled container hierarchy
		tomcat.addEngine(engine);
		Connector connector = tomcat.createConnector(listenIP, listenPort, false);
		tomcat.addConnector(connector);
		// Start the embedded server
		try {
			tomcat.start();
		} catch (LifecycleException e) {
			throw new RuntimeException(e);
		}
		EmbeddedTomcat srv = new EmbeddedTomcat(tomcat, listenIP, listenPort);
		return srv;
	}

	private Embedded tomcat;
	private String listenIP;
	private int listenPort;

	public void stop() {
		try {
			tomcat.stop();
		} catch (LifecycleException e) {
			throw new RuntimeException(e);
		}
	}

	public String getListenIP() {
		return listenIP;
	}

	public int getListenPort() {
		return listenPort;
	}

	public static void main(String[] args) {
		//内嵌Tomcat的工作目录
		String tomcathome = "D://Test//TestEmbedTomcat";
		//启动内嵌的Tomcat
		final EmbeddedTomcat tomcat = EmbeddedTomcat.startup(tomcathome, "examples", 8080, true);
		//打印启动信息
		System.out.println("Tomcat started at " + tomcat.getListenIP() + ":" + tomcat.getListenPort());
		//在JVM中添加一个Hook,这样可以在虚拟机退出时关闭tomcat以释放相关资源
		Runtime.getRuntime().addShutdownHook(new Thread() {
			public void run() {
				tomcat.stop();
			}
		});
	}
}

 

从上述代码来看,将Tomcat内嵌到自己的应用中还是比较简单和方便的,如果你了解Tomcat的目录结构或者是工作原理,那么上述代码就更加容易理解了。

 

原创文章,转载请注明出处:http://www.yshjava.cn/post/418.html

 

你可能感兴趣的:(tomcat,EmbeddedTomcat)