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。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found