sexta-feira, 6 de setembro de 2013

Recuperar PID de uma JVM especifica

Salve galera,

Já precisaram recuperar o PID de uma JVM especifica? Dependendo de como o aplicativo Java  foi iniciado, e se tivermos mais do que um aplicativo rodando, a missão se torna meio complexa e enrolada. Abaixo um código Java que identifica o PID de uma JVM especifica. Precisamos do utilitário jps do java, encontrado na pasta bin do jdk. Ao executarmos o jps, como saída temos o PID das JVM's em execução, junto com um identificador do processo, que são os argumentos passados para a JVM. Por exemplo, um Glassfish apresenta o nome ASMain ao lado do PID, enquanto o ActiveMQ apresenta o nome aqtivemq.jar ao lado do PID. Então é de responsabilidade do programa que precisa usar o recurso saber o nome gerado de antemão. Para ter essa informação é só rodar o aplicativo que se quer controlar, depois rodar o jps e ver as saidas. Abaixo um código que identifica se determinado aplicativo está sendo executado e pega seu PID



 public boolean hasJavaProcess() throws IOException {


        String glassfishProcessName = "ASMain";
        File file = new File(System.getenv("JAVA_HOME"), "bin");

        if (System.getProperty("os.name").toLowerCase().contains("windows")) {
            file = new File(file, "jps.exe");
        } else {
            file = new File(file, "jps");
        }

        String pid = null;

        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("\"" + file.getAbsolutePath() + "\"");
        InputStream in = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = null;

        while ((line = reader.readLine()) != null) {
            if (line.contains(glassfishProcessName )) {
                pid = line.replace(glassfishProcessName , "").replace(" ", "");
                break;
            }
        }
        reader.close()
 
       return pid != null;
    }

Ah, mais uma coisa.. Para uma melhor analise dos processos Java em execução, junto do jps você pode rodar a jvisualvm, que da informações mais detalhadas sobre o que está em rodando.

Até pode parecer meio tosco deselegante, mas todas as soluções que encontrei na net eram piores, ao meu ver, pois dependiam de alguma interação com o sistema operacional, usando um ps no Linux ou o tasklist no Windows. Essa solução que criei foi bem por acaso, pois nem conhecia o jps.. mas pensei que poderia ter alguma coisa útil entre aqueles milhões de programas na pasta do sdk. E assim, solucionei o problema e fiquei bem feliz com isso! ;)

Até a próxima!

Nenhum comentário:

Postar um comentário