java 如何遠程控制tomcat啟動關機

最近我在考慮如何遠程控制tomcat的啟動和關機,最後是有友好的界面,能夠實現一鍵式操作的,這樣會肯定是會很方便的,網上找瞭半天,沒找到,有說使用sheel腳本的,有在tomcat服務器上面安裝個客戶端的,這些都不是我所需要的,後來不經意在網上找到一篇文章稍微講述瞭下,但是他寫的不完整,一些關鍵的地方沒提到,還有一些地方寫錯瞭,我重新整理瞭下,在這裡分享給大傢。

首先,我下載瞭一個嶄新的tomcat,我選擇的是7版本的。

解壓後的界面如下圖所示:

這裡寫圖片描述

這裡我們先來說2個需要註意的問題:

1. webapps下面有個文件夾叫**manager**,很多時候我們會把webapps下面的東西都刪瞭,然後再放我們的工程,其實這個文件夾是用來做tomcat管理的,我們要留著。

2. conf文件夾下面有個文件叫tomcat-users.xml,它是來做tomcat管理的用戶權限的

我們就是利用這兩塊內容來實現對tomcat的遠程控制的。

tomcat提供的manager項目提供瞭一些api,我們用到的有下面四個:

1. http://localhost:9000/manager/text/list:可以得到此tomcat正在運行的項目以及它們的狀態。

2. http://localhost:9000/manager/text/reload?path=/ROOT:重新部署一個項目ROOT項目

3. http://localhost:9000/manager/text/start?path=/ROOT:啟動ROOT項目

4. http://localhost:9000/manager/text/stop?path=/ROOT:關閉ROOT項目

ROOT是我們控制的項目名稱,你可以根據你實際需要去改為你的項目名。

首先,我們通過http://localhost:9000/manager/text/list得到正在運行的項目列表,得到的結果大概如下:

這裡寫圖片描述

我們來分析下這段結果,第一行我們忽略,代表的是tomcat在運行,下面有一些項目在正常運行。

我們來項目看看下面這些,以/examples:running:0:examples為例子,它有三個:號,第一個:前的內容我們忽略,running為正在運行中(若為stopped則代表已經停止),0代表狀態為正常(其他為異常)。

分析好我們就可以用java代碼來操作這些瞭。

具體代碼如下:

package com.baibin.utils;
import sun.misc.BASE64Encoder;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
public class TomcatHTMLUtil {
    public static String message(String operateURL) {
        StringBuffer dataResult = new StringBuffer();
        URL url = null;
        try {
            url = new URL(operateURL);
            URLConnection conn = (URLConnection) url.openConnection();
            /**
             * 這裡的用戶名和密碼是由tomcat的%tomcat_home%/conf/tomcat-users.xml裡所配置的用戶
             */
            String username = "tomcat";
            String password = "tomcat";
            String configuration = username + ":" + password; // manager角色的用戶
            String encodedPassword = new BASE64Encoder().encode(configuration.getBytes());
            conn.setRequestProperty("Authorization", "Basic " + encodedPassword);
            InputStream is = conn.getInputStream();
            BufferedReader bufreader = new BufferedReader(new InputStreamReader(is));
            String line = null;
            while ((line = bufreader.readLine()) != null) {
                dataResult.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataResult.toString();
    }
    /**
     * 獲取tomcat正在運行的webApp的參數
     *
     * @return
     */
    public List<WebApp> getTomcatWebAppData() {
        List<WebApp> webAppArrayList = new ArrayList<WebApp>();
        String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/list");
        String[] oldDataStrs = data.split("/");
        if (oldDataStrs[0].startsWith("OK")) {
            for (int i = 1; i < oldDataStrs.length; i++) {
                String[] names = oldDataStrs[i].split(":");//長度為4 0 :忽略 1:狀態 2:0 狀態   3:名稱
                WebApp webApp = new WebApp();
                webApp.setName(names[3]);
                if (names[1].equals("running")) {
                    if (oldDataStrs[i].split(":")[2].equals("0")) {
                        webApp.setStatus("運行");
                    } else {
                        webApp.setStatus("異常");
                    }
                } else if (names[1].equals("stopped")) {
                    if (oldDataStrs[i].split(":")[2].equals("0")) {
                        webApp.setStatus("停止");
                    } else {
                        webApp.setStatus("異常");
                    }
                } else {
                    webApp.setStatus("異常");
                }
                webAppArrayList.add(webApp);
            }
            //}
        }
        return webAppArrayList;
    }
    /**
     * 重新部署一個項目
     *
     * @param webAppName
     * @return
     */
    public boolean reloadWebApp(String webAppName) {
        String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/reload?path=/" + webAppName);
        if (data.startsWith("OK")) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 停止一個項目
     *
     * @param webAppName
     * @return
     */
    public boolean stopWebApp(String webAppName) {
        String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/stop?path=/" + webAppName);
        if (data.startsWith("OK")) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 開始一個項目
     *
     * @param webAppName
     * @return
     */
    public boolean startWebApp(String webAppName) {
        String data = TomcatHTMLUtil.message("http://localhost:9000/manager/text/start?path=/" + webAppName);
        if (data.startsWith("OK")) {
            return true;
        } else {
            return false;
        }
    }
}
package com.baibin.utils;
/**
 * Created by ibm on 2017/3/22.
 */
public class WebApp {
    /**
     * 項目名稱
     */
    private String name;
    /**
     * 運行狀態 "成功" or "停止"
     */
    private String status;
    @Override
    public String toString() {
        return "WebApp{" +
                "name='" + name + '\'' +
                ", status='" + status + '\'' +
                '}';
    }
    public String getName() {
        return name;
    }
    public String getStatus() {
        return status;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

調用方式如下:

<body>
<%
    TomcatHTMLUtil util = new TomcatHTMLUtil();
    /*啟動ROOT項目*/
    util.startWebApp("ROOT");
    /*關閉ROOT項目*/
    util.stopWebApp("ROOT");
%>
</body>

這樣就可以遠程控制瞭,前臺寫的比較簡單,還可以繼續優化,當然那不是重點,這裡就不寫瞭。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。