Tenho uma dúvida meio básica mas, toda via, gostaria de implementar uma funcionalidade que não consegui…
No netbeans se você possuir uma instância dele em execução ele não abre uma nova da o foca na instância em execução. As vezes até exibe uma mensagem informando que possui uma instância em execução caso o windows tenha fechado incorretamente.
Não sei como fazer este controle, talvez possa fazer criando um arquivo, sei lá, mas existir uma forma de ler da máquina virtual e saber se existe uma instância de um jar em execução.
Pensei também em utilizar uma variável estática, e ai vem outra dúvida, tinha a idéia que teria apenas uma por classe, mas parece que cada instância de um jar na máquina virtual possui as suas variáveis estáticas. Caso se abra um jar 2 vezes ele carrega duas vezes as classes na máquina virtual?
Não sei se ficou claro, mas não consegui encontrar nada a este respeito, desde já agradeço.
Tipo… variavel estatica é por classe e classe é por aplicação entao 2 aplicações rodando na jvm terão classes separadas logo as variaveis estaticas tb…
uma possibilidade é ao abrir uma instancia salvar em um arquivo fisico da maquina o endereço da instancia ai caso abra uma segunda ele verifica se ha uma instancia aberta pelo arquivo fisico havendo ele da da um up na intancia aberta e fecha a nova instancia…
acabei de ter essa idéia nao sei se é a mais adequada…
pois é
eu comentei acima esta possibilidade, mas deve ter como fazer via código. Mexi um pouco vi que tem uma classe ClassLoader, talvez dê para fazer.
O problema do arquivo é que se acontecer um problema e a aplicação for fechada de maneira inesperada, o arquivo vai ficar lá. Mas da para contornar isso também.
Mas é curiosidade mesmo
[quote=Beavis_]pois é
eu comentei acima esta possibilidade, mas deve ter como fazer via código. Mexi um pouco vi que tem uma classe ClassLoader, talvez dê para fazer.
O problema do arquivo é que se acontecer um problema e a aplicação for fechada de maneira inesperada, o arquivo vai ficar lá. Mas da para contornar isso também.
Mas é curiosidade mesmo :)[/quote]
Acho que daria para:
Ocupar alguma porta TCP ou UDP pré-definida quando o programa inicializar, e quem sabe até registrar essa porta no IANA, sendo que quando alguma outra instância tentar inicializar, não deverá conseguir ocupar a mesma porta e portanto não deverá conseguir prosseguir executando.
Criar um arquivo em algum lugar pré-definido e fazer o programa reter o acesso a esse arquivo, não deixando que outro programa leia ou modifique tal arquivo, sendo que quando alguma outra instância tentar inicializar, não deverá conseguir obter acesso ao arquivo e portanto não deverá conseguir prosseguir executando.
Ok. Estas duas opções irão resolver o problema.
Mas a título de curiosidade existe uma forma de buscar as classes e aplicações rodando na máquina virtual?
É necessário um jar especifico (tools.jar) que tem 11MB… mas o cara que postou essa solução descompactou e pegou somente as classes necessarias e disponibilizou para download… estou anexando as classes em formato .zip e o .jar delas tambem.
É uma boa pergunta, eu confesso que sou novato e não entendo muito bem de JMX… posso ta falando besteira, mas creio no JDK já deve ter incluído/habilitado.
O fato é que só precisei adicionar no meu projeto o jar que foi anexo na minha mensagem anterior e funcionou.