日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

监控Tomcat解决方案(监控应用服务器系列文章分享)

發布時間:2025/6/17 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 监控Tomcat解决方案(监控应用服务器系列文章分享) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用JMX接口開發監控程序
? ◆ 全部代碼需要從零開始,代碼量較大
? ◆ 支持各不同版本比較麻煩,每個版本可能有差異
? ◆ 可支配性強
? ◆ 最重要的一個缺點是,配置比較麻煩

Tomcat激活JMX遠程配置

① ■?先修改Tomcat的啟動腳本,window下tomcat的bin/catalina.bat(linux為catalina.sh),添加以下內容,8999是jmxremote使用的端口號,第二個false表示不需要鑒權:

set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

?

可以加在if "%OS%" == "Windows_NT" setlocal 一句后的大段的注釋后面。

參考官方說明:
????http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote

② ■?上面的配置是不需要鑒權的,如果需要鑒權則添加的內容為:

set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access
set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

?


? 然后復制并修改授權文件,$JAVA_HOME/jre/lib/management下有jmxremote.access和jmxremote.password的模板文件,將兩個文件復制到$CATALINA_BASE/conf目錄下
? ● 修改$CATALINA_BASE/conf/jmxremote.access 添加內容:
???? monitorRole readonly
???? controlRole readwrite

? ● 修改$CATALINA_BASE/conf/jmxremote.password 添加內容:
???? monitorRole tomcat
???? controlRole tomcat

注意:如果只做第一步沒有問題,進行了第二步Tomcat就啟動不了,那么很可能是密碼文件的權限問題
??? 需要修改jmxremote.password文件的權限,只有運行Tomcat的用戶有訪問權限
??? Windows的NTFS文件系統下,選中文件,點右鍵 -->“屬性”-->“安全”--> 點“高級”--> 點“更改權限”--> 去掉“從父項繼承....”--> 彈出窗口中選“刪除”,這樣就刪除了所有訪問權限。再選“添加”--> “高級”--> “立即查找”,選中你的用戶,例administrator,點“確定",“確定"。來到權限項目窗口,勾選“完全控制”,點“確定”,OK了。

官方的提示:
????The password file should be read-only and only accessible by the operating system user Tomcat is running as.?

③ ■?重新啟動Tomcat,在Windows命令行輸入“netstat -ano”查看配置的端口號是否已打開,如果打開,說明上面的配置成功了。

④ ■?使用jconsole測試JMX。

?? 運行$JAVA_HOME/bin目錄下的jconsole.exe,打開J2SE監視和管理控制臺,然后建立連接,如果是本地的Tomcat則直接選擇然后點擊連接,如果是遠程的,則進入遠程選項卡,填寫地址、端口號、用戶名、口令即可連接。Mbean屬性頁中給出了相應的數據,Catalina中是tomcat的,java.lang是jvm的。對于加粗的黑體屬性值,需雙擊一下才可看內容。

遇到的幾個問題:

1.tomcat必須要用命令或者startup.bat啟動,jconsole才能連接成功。

2.盡量用第一種方式配置,但是要把密碼文件拷貝到tomcat-conf目錄下,設置密碼和口令。

3.tomcat必須配置環境變量,如有多個tomcat同一臺服務器上,則添加一個CATALINA_HOME2,然后把tomcat下面catalina.bat和startup.bat中所有CATALINA_HOME替換為CATALINA_HOME2.

實例代碼:

package com.gsww.jup.controller.chatShowController;

import java.lang.management.MemoryUsage;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


import com.gsww.jup.controller.BaseController;

@Controller
@RequestMapping(value = "/applicationServerMonitoring")
public class ApplicationServerMonitoringController extends BaseController{


@RequestMapping(value = "/serverList",method = RequestMethod.GET)
public String serverList(Model model,ServletRequest request,HttpServletRequest hrequest) {
try{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();

Map<String,Object> map=getMap("61.178.5.73","8092");
map.put("server", "客戶端接口服務1");

Map<String,Object> map1=getMap("10.18.23.218","8088");
map1.put("server", "客戶端接口服務2");

Map<String,Object> map2=getMap("127.0.0.1","7999");
map2.put("server", "心跳接口服務");

Map<String,Object> map3=getMap("127.0.0.1","8999");
map3.put("server", "后臺服務");

list.add(map);
list.add(map1);
list.add(map2);
list.add(map3);
model.addAttribute("list", list);

}catch(Exception ex){
ex.printStackTrace();
}
return "chatShow/serverMonitor_list";
}
public Map<String, Object> getMap(String ip,String port){
Map<String, Object> serverMap=new HashMap<String, Object>();
try {
String jmxURL = "service:jmx:rmi:///jndi/rmi://"+ip+":"+port+"/jmxrmi";//tomcat jmx url
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);

Map map = new HashMap();
String[] credentials = new String[] { "monitorRole" , "QED" };
map.put("jmx.remote.credentials", credentials);
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();


//------------------------ JVM -------------------------
//堆使用率
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
long maxMemory = heapMemoryUsage.getMax();//堆最大
long commitMemory = heapMemoryUsage.getCommitted();//堆當前分配
long usedMemory = heapMemoryUsage.getUsed();
System.out.println("推最大:"+maxMemory);
System.out.println("堆當前分配:"+commitMemory);
System.out.println("堆使用:"+usedMemory);
System.out.println("heap:"+(double)usedMemory*100/commitMemory+"%");//堆使用率
serverMap.put("maxMemory", format((double)maxMemory/1000000)+"M");
serverMap.put("commitMemory", format((double)commitMemory/1000000)+"M");
serverMap.put("usedMemory", format((double)usedMemory/1000000)+"M");
serverMap.put("usedPersent", format((double)usedMemory*100/commitMemory)+"%");

return serverMap;
} catch (Exception e) {
serverMap.put("maxMemory", "--");
serverMap.put("commitMemory", "--");
serverMap.put("usedMemory", "--");
serverMap.put("usedPersent", "100.00%");
return serverMap;
}
}

public String formatTimeSpan(long span){
long minseconds = span % 1000;

span = span /1000;
long seconds = span % 60;

span = span / 60;
long mins = span % 60;

span = span / 60;
long hours = span % 24;

span = span / 24;
long days = span;
return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days,hours,mins,seconds,minseconds).toString();
}
public String format(double s) {
DecimalFormat df = new DecimalFormat("#.##");
return df.format(s);
}

}

轉載于:https://www.cnblogs.com/wjwen/p/4829932.html

總結

以上是生活随笔為你收集整理的监控Tomcat解决方案(监控应用服务器系列文章分享)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。