JAVA程序獲取Tomcat的運行狀態

用瀏覽器來查看Tomcat的運行狀態:java

    配置Tomcat的管理用戶和權限。
瀏覽器

    打開%Tomcat_Home%/conf/目錄下的tomcat-user.xml文件,配置如下內容:
tomcat

    

<role rolename="manager-status"/>
<role rolename="manager"/>  
<role rolename="manager-jmx"/> 
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="admin"/>

<user username="tomcat" password="tomcat" roles="tomcat"/> 

<user username="admin" password="tomcat" roles="manager,manager-gui,admin,manager-status,manager-jmx,manager-script"/>

    此時可經過admin用戶來訪問tomcat的狀態,在瀏覽器地址中輸入:app

     http://localhost:8080/manager/status?XML=truedom

    輸入用戶名:admin,密碼:tomcat. 出現如下頁面,即Tomcat的運行狀態。eclipse

    

    或者能夠直接訪問:
測試

    http://admin:tomcat@localhost :8080/manager/status?XML=trueui

Java程序獲取Tomcat運行狀態:lua

    根據上面的思路,能夠經過URL來獲取Tomcat  manager返回的信息,再解析這個信息就能夠了,參考cacti的監控方式中,用perl編寫的監控模板也是如此,以下:
url

 my $host = shift;
 my $username = shift;
 my $password = shift;
 my $connector = shift or &usage;
 my $url = "http://$username:$password"."\@$host/manager/status?XML=true";

 my $xml = `GET $url`;

 my $status = XMLin($xml);

    所以Java也可參考此方法:

@Test
	public void test1() throws IOException {
		URL url = null;
		InputStream is = null;
		StringBuffer resultBuffer = new StringBuffer();
		BufferedReader breader = null;
		try {
			url = new URL(
					"http://admin:tomcat@localhost:8080/manager/status?XML=true");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			is = conn.getInputStream();

			breader = new BufferedReader(new InputStreamReader(is));
			String line = "";
			while ((line = breader.readLine()) != null) {
				resultBuffer.append(line);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} finally {
			if (breader != null)
				breader.close();
			if (is != null)
				is.close();
		}
		System.out.println(resultBuffer.toString());
	}

    運行時出現以下錯誤:

java.io.IOException: Server returned HTTP response code: 401 for URL: http://admin:tomcat@localhost:8080/manager/status?XML=true
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625)
	at com.merit.monitor.tomcat.TestTomcatStatus.test1(TestTomcatStatus.java:57)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

出錯緣由能夠去stackoverview上查看,這裏直接給出正確的解決方法:

一、編寫獲取Tomcat狀態的字符串方法:

/**
	  * @Description: 獲取指定URL的內容
	  * @Version1.0 2014-7-23 下午02:18:22 by xuqiang(xuqiang@merit.com)建立
	  * @param tempurl url地址
	  * @param username tomcat 管理用戶名
	  * @param password tomcat 管理用戶密碼
	  * @return
	  * @throws IOException
	  */
	public static String getHtmlContext(String tempurl, String username, String password) throws IOException {
		URL url = null;
		BufferedReader breader = null;
		InputStream is = null;
		StringBuffer resultBuffer = new StringBuffer();
		try {
			url = new URL(tempurl);
			String userPassword = username + ":" + password;
			String encoding = new sun.misc.BASE64Encoder().encode (userPassword.getBytes());//在classpath中添加rt.jar包,在%java_home%/jre/lib/rt.jar

			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestProperty("Authorization", "Basic " + encoding);
			is = conn.getInputStream();
			breader = new BufferedReader(new InputStreamReader(is));
			String line = "";
			while ((line = breader.readLine()) != null) {
				resultBuffer.append(line);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} finally {
			if(breader != null)
				breader.close();
			if(is != null)
				is.close();
		}
		return resultBuffer.toString();
	}

二、編寫測試方法:

@Test
	public void test() {
		String result = "";
		Document document = null;//引入org.dom4j包
		try {
			result = GetHtmlContext.getHtmlContext("http://localhost:8080/manager/status?XML=true", "admin", "tomcat");
			document = DocumentHelper.parseText(result);//將字符串轉化爲XML的Document
		} catch (IOException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		System.out.println(document.asXML());
	}

運行junit,正常打印監控狀態的XML格式內容。這樣就能夠解析XML Dom的值獲取Tomcat的運行狀態。

相關文章
相關標籤/搜索