1. 程式人生 > >防止JAVA程式重複啟動程序的解決辦法

防止JAVA程式重複啟動程序的解決辦法

        今天看見一個同事為防止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));
            }
        }
    }