防止JAVA程式重複啟動程序的解決辦法
阿新 • • 發佈:2019-02-07
今天看見一個同事為防止JAVA程式重複啟動而煩惱,突然想到JDK自帶工具JConsole的新建連線畫面好像顯示有所有JAVA程序的PID和啟動時JAVA類的名稱。如果能夠取得啟動類的全名,不就可以防止重複啟動了嗎。
於是上CSDN下載了一個JConsole的原始碼。發現在sun.tools.jconsole.LocalVirtualMachine有實現類似功能的程式碼,摘錄如下:(是不是正的可以防止重複啟動還有待實證,此處暫記下解決思路)
private static void getMonitoredVMs(Map<Integer, LocalVirtualMachine> map) { MonitoredHost host; Set vms; try { host = MonitoredHost.getMonitoredHost(new HostIdentifier((String)null)); vms = host.activeVms(); } catch (java.net.URISyntaxException sx) { throw new InternalError(sx.getMessage()); } catch (MonitorException mx) { throw new InternalError(mx.getMessage()); } for (Object vmid: vms) { if (vmid instanceof Integer) { int pid = ((Integer) vmid).intValue(); String name = vmid.toString(); // default to pid if name not available boolean attachable = false; String address = null; try { MonitoredVm mvm = host.getMonitoredVm(new VmIdentifier(name)); // use the command line as the display name // 注:此處取得該程序的啟動類全名 name = MonitoredVmUtil.commandLine(mvm); attachable = MonitoredVmUtil.isAttachable(mvm); address = ConnectorAddressLink.importFrom(pid); mvm.detach(); } catch (Exception x) { // ignore } map.put((Integer) vmid, new LocalVirtualMachine(pid, name, attachable, address)); } } }