OSGI bundle control tomcat start&stop

需求:
在OSGI应用中,启停Tomcat Server。
比较奇怪哦,我也觉得。这个需求的目的,是为了部署某个特定的应用。本来使用Spring DM、Apache flex or其他支持OSGI的App server(如jboss)就很容易将web应用移植到osgi容器中。但人家强调web应用已经在tomcat中成功部署,为了省事和产品的统一性,我就使用java执行bat,权当稳住局面,后续集中开发。、呵呵
设计:
启动Tomcat 代码片段:

Runtime rt = Runtime.getRuntime();
rt.exec( "cmd /c start /b catalina.bat run", null, new File( "D:/tomcat/bin/ "));
Thread.sleep(1000);// must be exist, this is to wait cmd excute.

注意我没使用startup.bat,而是使用了catalina.bat run,而且使用start /b,这样就会仅仅在后台启动,没有黑窗口了。
停止Tomcat 代码片段
Runtime rt = Runtime.getRuntime();
rt.exec( "cmd /c start /b catalina.bat stop ", null, new File( "D:/tomcat/bin/ "));
Thread.sleep(1000);// must be exist, this is to wait cmd excute.

似乎大功告成了,但在bundle中还是遇到了一些问题:Tomcat没启动??why and why?原来是用以启动Tomcat的线程必须“终止”后,Tomcat才能完整起来。那好办,价格线程就OK了。

最终代码如下:
public class Activator implements BundleActivator {

	private static BundleContext context;
	private String TOMCAT_BASE = null;
	static BundleContext getContext() {
		return context;
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;
		String property = System.getProperty("user.dir");
		String createURI = createURI(property + "/config/appserver.properties");
		Properties properties = new Properties();
		properties.load(new FileInputStream(createURI));
		TOMCAT_BASE = (String) properties.get("app_path");
		if(!new File(TOMCAT_BASE).exists()){
			TOMCAT_BASE =  createURI(property +"/config/"+TOMCAT_BASE);
			if(!new File(TOMCAT_BASE).exists()){
				System.err.println("App Server is not exist!!!");
				return;
			}
			if(!TOMCAT_BASE.endsWith("/"))
				TOMCAT_BASE = TOMCAT_BASE + "/";
		}
		
		System.out.println("App Server path:" + TOMCAT_BASE);
		Thread startThread = new Thread(new StartRunnable());
		startThread.start();
	}
	
	/*
	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext bundleContext) throws Exception {
		Activator.context = null;
		
		Thread startThread = new Thread(new StopRunnable());
		startThread.start();
	}
	
	public static String createURI(String s) {
		String retVal = new String(s);
		retVal = retVal.replace("\\", "/");
		retVal = retVal.replace(" ", "%20");
		return retVal;
	}
	/**
	 * start tomcat server
	 * @author qinghua
	 *
	 */
    class StartRunnable implements Runnable {
        public void run(){
    		System.out.println("Server Starting ...");
    		try {
    			Runtime rt = Runtime.getRuntime();
				rt.exec("cmd /c start /b catalina.bat run", null, new File(TOMCAT_BASE+ "bin/"));
				Thread.sleep(1000);// must be exist, this is to wait cmd excute.
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}   
            System.out.println("Server Started!");
        }
    }
    /**
     * stop tomcat server
     * @author qinghua
     *
     */
    class StopRunnable implements Runnable {
        public void run(){
        	System.out.println("Server Stopping...");
    		try {
    			Runtime rt = Runtime.getRuntime();
				rt.exec("cmd /c start /b catalina.bat stop", null, new File(TOMCAT_BASE+ "bin/"));
				Thread.sleep(1000);// must be exist, this is to wait cmd excute.
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}   
    		System.out.println("Server Stopped!!");
        }
    }

}

你可能感兴趣的:(osgi bat)