一:目的
寫這一段程序的原因是需要監控部署的的應用是否正常運行,並且顯示其運行狀態。在進程莫名死掉后甚至可以自動啟動該應用。
首先這段代碼可以獲取的信息如下
/** * 當前進程運行的主機名 */ private String host; /** * 當前進程所在的IP地址 */ private String ipAddress; /** * 空閑內存 */ private long freeMemory; /** * 內存總量 */ private long totalMemory; /** * java虛擬機允許開啟的最大的內存 */ private long maxMemory; /** * 操作系統名稱 */ private String osName; /** * 進程號 */ private long pid; /** * 程序啟動時間 */ private Date startTime; /** * 類所在路徑 */ private String classPath; private String projectPath; /** * 程序運行時間,單位毫秒 */ private long runtime; /** * 線程總量 */ private int threadCount;
二:獲取這段信息的代碼
這里直接貼代碼,並沒有什么很難的邏輯
import java.io.File; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.framework.monitor.common.bean.ClientStatus; public class StatusUtil { public static Logger LOG = LoggerFactory.getLogger(StatusUtil.class); private static ClientStatus clientStatus = new ClientStatus(); /** * * @param projectName 工程名稱 * @param version 版本號 * @param group 分組號,對應用進行分組 * @param ipAddress 可以為NULL,為NULL則會自動獲取,但是如果主機有多個網卡,可能會取錯 * @param startCMD 啟動進程的命令,當應用死掉后,會調用此命令來啟動 * @param remark 備注,如果沒有可以為空 * @return */ public static ClientStatus getClientStatus(String projectName,int version,String group,String ipAddress,String startCMD,String[] remark){ clientStatus.setProjectName(projectName); clientStatus.setVersion(version); clientStatus.setRemark(remark); clientStatus.setGroup(group); RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); Runtime runtime = Runtime.getRuntime(); //空閑內存 long freeMemory = runtime.freeMemory(); clientStatus.setFreeMemory(byteToM(freeMemory)); //內存總量 long totalMemory = runtime.totalMemory(); clientStatus.setTotalMemory(byteToM(totalMemory)); //最大允許使用的內存 long maxMemory = runtime.maxMemory(); clientStatus.setMaxMemory(byteToM(maxMemory)); //操作系統 clientStatus.setOsName(System.getProperty("os.name")); InetAddress localHost; try { localHost = InetAddress.getLocalHost(); String hostName = localHost.getHostName(); clientStatus.setHost(hostName); if(ipAddress == null){ ipAddress = localHost.getHostAddress(); } } catch (UnknownHostException e) { e.printStackTrace(); LOG.error("無法獲取當前主機的主機名與Ip地址"); clientStatus.setHost("未知"); } //ip clientStatus.setIpAddress(ipAddress); clientStatus.setId(makeClientId(projectName,ipAddress)); //程序啟動時間 long startTime = runtimeMXBean.getStartTime(); Date startDate = new Date(startTime); clientStatus.setStartTime(startDate); //類所在路徑 clientStatus.setClassPath(runtimeMXBean.getBootClassPath()); //程序運行時間 clientStatus.setRuntime(runtimeMXBean.getUptime()); //線程總數 clientStatus.setThreadCount(ManagementFactory.getThreadMXBean().getThreadCount()); clientStatus.setProjectPath(new File("").getAbsolutePath()); clientStatus.setCommitDate(new Date()); clientStatus.setPid(getPid()); return clientStatus; } /** * 把byte轉換成M * @param bytes * @return */ public static long byteToM(long bytes){ long kb = (bytes / 1024 / 1024); return kb; } /** * 創建一個客戶端ID * @param projectName * @param ipAddress * @return */ public static String makeClientId(String projectName,String ipAddress){ String t = projectName + ipAddress + new File("").getAbsolutePath(); int client_id = t.hashCode(); client_id = Math.abs(client_id); return String.valueOf(client_id); } /** * 獲取進程號,適用於windows與linux * @return */ public static long getPid(){ try { String name = ManagementFactory.getRuntimeMXBean().getName(); String pid = name.split("@")[0]; return Long.parseLong(pid); } catch (NumberFormatException e) { LOG.warn("無法獲取進程Id"); return 0; } } }