Olá Galera,
Seguindo um conselho do meu amigo Gabriel Massote, resolvi dar as caras por aqui também e postar conteúdos.
Espero que sirvam de alguma coisa.
Primeiramente, vou falar um pouco do Java Process Status Tool ou simplesmente JPS.
O JPS é uma ferramenta que permite listar todos os processos (nomes das classes que contém o método main) Java atualmente em execução na Java Virtual Machine. A ferramenta é encontrada na pasta bin do JDK 5 e posteriores (Exemplo: C:\Arquivos de programas\jdk1.6.0\bin).
Para utilizar a ferramenta precisamos abrir o prompt de comando do windows ou terminal do linux e navegar até a pasta bin (comando cd). Apartir daí é só digitar o comando jps e verificar os resultados.
Exemplo:
C:\Arquivos de programas\jdk1.6.0\bin> jps
30286 Jps
30271 Main
Opções do comando:
- l : (L) Retorna o PID do processo e o nome completo da classe que está sendo executada.
Exemplo:
C:\Arquivos de programas\jdk1.6.0\bin> jps -l
30456 sun.tools.jps.Jps
30271 org.netbeans.Main
- m : Retorna o PID do processo, o nome e os parâmetros que foram passados para a classe que está em execução.
Exemplo:
C:\Arquivos de programas\jdk1.6.0\bin> jps -m
30529 Main -c
30664 Jps -m
Estas opções também podem ser utilizadas em conjunto (Ex: jps -lm). Mais opções podem ser encontradas na documentação do JPS.
Entendidos os conceitos da JPS, agora veremos como utilizar as classes Monitored.
Primeiramente devemos fazer uma pequena gambiarra importar para o classpath o jar tools.jar (disponível no JDK 1.5 ou posterior, na pasta lib).
Exemplo: C:\Arquivos de programas\Java\jdk1.6.0\lib
Utilizaremos o código abaixo, feito por mim, para entendermos como funciona as classes.
O código está comentado de forma que está fácil de entender.
[code]import java.util.Set;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashSet;
import sun.jvmstat.monitor.MonitorException;
import sun.jvmstat.monitor.MonitoredHost;
import sun.jvmstat.monitor.MonitoredVm;
import sun.jvmstat.monitor.MonitoredVmUtil;
import sun.jvmstat.monitor.VmIdentifier;
public void getJVMProcesses(){
try {
//Define qual máquina será monitorada, no nosso caso a máquina local
MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
//Armazena no Hash os processos da maquina virtual
Set vmlist = new HashSet(local.activeVms());
//Executa enquanto houverem processos, fazendo com que um Object receba um id de cada um
for (Object id : vmlist){
//Configura qual processo será monitorado, no caso, o indicado pelo Object "id"
MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + id));
//Mostra somente o nome da classe main do processo
System.out.println(MonitoredVmUtil.mainClass(vm, false));
//Mostra o nome completo da classe main do processo (com nomes dos pacotes)
System.out.println(MonitoredVmUtil.mainClass(vm, true));
}
//Excessões disparadas pelas classes Monitored
} catch (MonitorException ex) {
log.error("Erro na monitoração da JVM. \nErro: "+ex.getMessage());
} catch (URISyntaxException ex) {
log.error("Erro na busca do host para monitoração da JVM. \nErro: "+ex.getMessage());
}
}
[/code]
Neste código está presente somente a função e as bibliotecas necessárias para o seu funcionamento, de modo que é necessário a construção de um main ou qualquer outro método para a invocação deste.
OBS: Como importamos de um pacote não público da Sun, pode ser que apareçam alguns warnings com a mensagem de forbidden package, se você necessita resolver isso, baixe o openJDK e importe o mesmo arquivo tools.jar.
Como é meu primeiro post, qualquer sugestão de modificação será bem vinda!
Qualquer dúvida, crie seu comentário que tentaremos ajudar!
Abraços a todos!
Gustavo.