// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Adicionando Instrumentação do JMX (Java Management Extensions) à Aplicação Java
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Adicionando Instrumentação do JMX (Java Management Extensions) à Aplicação Java - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Adicionando Instrumentação do JMX (Java Management Extensions) à Aplicação Java

*Duração esperada: 60 minutos*

O Módulo do Assistente JMX do NetBeans integra a tecnologia do JMX correta para seu workflow no NetBeans IDE. Este módulo permite que você desenvolva aplicações de gerenciamento, adicione o gerenciamento às aplicações existentes, desenvolva aplicações do gerenciador e monitore o estado da Máquina Virtual.

Este tutorial mostra como adicionar gerenciamento a uma aplicação existente (a aplicação Jogo de Anagramas de amostra do NetBeans). Primeiro você criará um Projeto Java de Anagrama não gerenciável. Depois você usará os Assistentes do JMX para gerar 90% do gerenciamento. Em seguida, você implementará o procedimento de gerenciamento específico da aplicação. Finalmente, você usará a opção Executar/Depurar projeto com JConsole para visualizar o MBeans do Anagrama.


== Exercícios do tutorial

image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"]

* <<Exercise_1,Exercício 1: Criando o projeto de amostra do Jogo de Anagramas do NetBeans>>
* <<Exercise_2,Exercício 2: Criando o MBean Padrão do JMX AnagramsStats e sua interface de Gerenciamento>>
* <<Exercise_3,Exercício 3: Adicionando atributos, operação e notificação ao MBean Padrão JMX AnagramsStats>>
* <<Exercise_4,Exercício 4: Adicionando o código de implementação ao MBean Padrão do JMX AnagramsStats>>
* <<Exercise_5,Exercício 5: Estabelecendo conexão ao gerenciamento e à aplicação juntos>>
* <<Exercise_6,Exercício 6: Executando o Jogo de Anagramas com JConsole>>


=== Pré-requisitos

Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir ou alguma experiência de programação com elas:

* Tecnologia JMX: link:http://download.oracle.com/javase/6/docs/technotes/guides/jmx/index.html[+ Documentação on-line do JMX+]
* Tecnologia Java: link:http://www.oracle.com/technetwork/java/javase/tech/index.html[+ Visão Geral das Tecnologias Java SE+]
* NetBeans IDE

Você também se beneficiará tendo conhecimento sobrelink:http://download.oracle.com/javase/6/docs/technotes/guides/management/index.html[+ Monitoramento e Gerenciamento da Plataforma Java+]


=== Software Necessário para o Tutorial

Para este tutorial, você precisa ter instalado no computador os seguintes softwares:

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Versão Java 7.2, 7.3, 7.4, 8.0 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8 

|Plug-in do JMX |Disponível na Central de Atualização do NetBeans 

|Plug-in de JConsole |Disponível na Central de Atualização do NetBeans 
|===

Para instalar os plug-ins *JMX* e *JConsole*, selecione Ferramentas > Plug-ins e faça download do módulo do Centro de Atualização do NetBeans.


=== Recursos



== Exercício 1: Criando o projeto de amostra do Jogo de Anagramas do NetBeans

O objetivo deste exercício é criar um Projeto Java executável. O jogo de Anagramas é uma Aplicação Swing que exibe uma palavra embaralhada para o usuário e espera que o usuário resolva o anagrama.

1. Selecione Arquivo > Novo Projeto (Ctrl-Shift-N).
2. Selecione a categoria Amostras > Java.
3. Selecione o projeto Jogo de Anagramas. Clique em Próximo.
4. No painel Nome e Localização do Projeto, defina a localização do projeto ou mantenha o valor default, se ele for adequado. Marque a caixa de seleção "Definir como Projeto Principal" se não estiver selecionada porque ela tornará as próximas ações mais fáceis. Clique em Finalizar.

Quando você clica em Finalizar, o IDE cria o projeto Jogo de Anagramas e exibe o projeto na janela Projetos.



. Clique com o botão direito do mouse no projeto AnagramGame e selecione Propriedades.


. Selecione a categoria Códigos-fonte e confirme se o formato de Código-fonte/Binário está definido como JDK 7 ou JDK 8. Clique em OK.

*Observação.* Para selecionar JDK 7 ou JDK 8, a Plataforma Java do projeto Jogo de Anagramas também deve ser pelo menos JDK 7 ou JKD 8, respectivamente. Você pode alterar a Plataforma Java do Jogo de Anagramas na categoria Bibliotecas na janela Propriedades.



. Clique com o botão direito do mouse no nó de projeto Jogo de Anagramas e selecione Executar.

Quando escolher Executar, o IDE compilará e acionará a aplicação Jogo de Anagramas.


== Exercício 2: Criando o MBean Padrão do JMX AnagramsStats e sua interface de Gerenciamento

A meta deste exercício é criar um esqueleto do MBean Padrão do JMX que é composto de sua classe de implementação e de sua interface de gerenciamento.

Execute as etapas a seguir para criar o MBean Padrão do JMX.

1. Confirme se o projeto Jogo de Anagramas está definido como o projeto principal.
2. Escolha Arquivo > Novo Arquivo (Ctrl-N).
3. Na categoria JMX, selecione MBean Padrão. Clique em Próximo.
image::images/jmx-newfile.png[title="Tipo de arquivo MBean Padrão no Assistente Novo Arquivo"]


. Digite as seguintes informações no painel Nome e Localização:
* Nome da Classe:  ``AnagramsStats`` 
* Localização: Pacotes de Origem (default)
* Pacote:  ``com.toy.anagrams.mbeans`` 
* Descrição:  ``Monitoramento e Gerenciamento do Jogo de Anagramas`` 

image::images/jmx-newmbean.png[]


. Clique em Finalizar.

Quando você clicar em Finalizar, a classe  ``AnagramsStats``  do MBean e a interface  ``AnagramsStatsMBean``  do MBean são geradas no pacote  ``com.toy.anagrams.mbeans``  do projeto AnagrmGame. Agora há vários esqueletos vazios que você preencherá no próximo exercício.


== Exercício 3: Adicionando atributos, operação e notificação ao MBean Padrão JMX AnagramsStats

A meta deste exercício é preencher o esqueleto do MBean gerado, de forma que ele monitore o tempo gasto pelo usuário para resolver um novo anagrama e uma notificação do JMX seja enviada, cada vez que um anagrama for resolvido.

O MBean conterá o seguinte:

* Dois Atributos chamados  ``LastThinkingTime``  e  ``NumResolvedAnagrams`` 
* Uma Operação chamada  ``resetAll`` .
* Uma notificação do tipo  ``AttributeChangeNotification`` . Esta notificação é emitida quando  ``LastThinkingTime``  é atualizado.

Execute as seguintes etapas para preencher o esqueleto do MBean.

1. Abra o arquivo de implementação  ``AnagramsStats.java``  do MBean no editor do NetBeans.
2. Clique com o botão direito do mouse no editor de código-fonte e selecione *JMX > Adicionar Atributos de MBean* no menu pop-up.
3. Adicione o atributo  ``LastThinkingTime``  clicando no botão Adicionar Atributo e fornecendo as seguintes informações.
* Nome do Atributo:  ``LastThinkingTime`` 
* Tipo: int
* Acesso: Somente Leitura
* Descrição:  ``Tempo gasto para resolver o último anagrama`` 

*Observação.* Não clique em OK ainda!



. Clique em Adicionar Atributo novamente e adicione o seguinte atributo  ``NumSolvedAnagrams`` . Clique em OK.
* Nome do Atributo:  ``NumSolvedAnagrams`` 
* Tipo: int
* Acesso: Somente Leitura
* Descrição:  ``Número de anagramas resolvidos`` 

image::images/jmx-addattribute.png[]

O código necessário para expor os atributos  ``LastThinkingTime``  e  ``NumSolvedAnagrams``  somente para leitura é gerado na classe  ``AnagramsStats``  do MBean e em sua interface.

Você pode ver a declaração de campos privados e os métodos getter públicos. Mais precisamente, olhando a view membros e no código gerado, você observará que os métodos  ``getLastThinkingTime``  e  ``getNumSolvedAnagrams``  são gerados na classe  ``AnagramsStats``  e em sua interface  ``AnagramsStatsMBean`` . Os campos privados  ``lastThinkingTime``  e  ``numSolvedAnagrams``  do tipo  ``int``  também foram gerados e serão utilizados para armazenar os valores do atributo real.

Em seguida, você adicionará mais três atributos para manter controle do tempo mínimo e máximo de reflexão que o usuário leva e do anagrama atual que está sendo proposto ao usuário.



. Clique com o botão direito do mouse no editor de código-fonte e selecione *JMX > Adicionar Atributos de MBean* no menu pop-up.


. Clique no botão Adicionar Atributo e adicione os seguintes atributos.
|===

|Nome do Atributo |Tipo |Acesso |Descrição 

|MinThinkingTime |int |Somente para Leitura |Tempo mínimo decorrido para resolver um anagrama 

|MaxThinkingTime |int |Somente para Leitura |Tempo máximo decorrido para resolver um anagrama 

|CurrentAnagram |String |Somente para Leitura |Anagrama atual para resolução 
|===

A caixa de diálogo deve ser semelhante à seguinte imagem.

image::images/jmx-addattribute2.png[title="Caixa de diálogo Adicionar Atributo após adicionar mais 3 atributos"]

*Observação.* Observe que os atributos que você já criou estão listados na caixa de diálogo.



. Clique em OK e salve suas alterações.


. Clique com o botão direito do mouse no editor de código-fonte e selecione *JMX > Adicionar Operações de MBean* no menu pop-up.


. Clique em Adicionar Operação e adicione a operação  ``resetAll()``  e especifique os seguintes detalhes. Clique em OK.
* Nome da Operação:  ``resetAll`` 
* Tipo de Retorno:  ``void`` 
* Parâmetros: (deixe vazia)
* Exceções: (deixe vazia)
* Descrição:  ``Redefinir estado do MBean`` 

image::images/jmx-addoperation.png[title="Adicionando a operação resetAll na caixa de diálogo Adicionar Operação"]

Depois de clicar em OK, você poderá ver se o código necessário para expor a operação  ``resetAll``  foi gerado na classe  ``AnagramsStats``  do MBean e em sua interface.



. Clique com o botão direito do mouse no editor de código-fonte e selecione *JMX > Interface Implementar NotificationEmitter* no menu pop-up.


. Especifique os seguintes detalhes na caixa de diálogo Implementar interface NotificationEmitter.
* *Selecione Gerar Delegação para Difusor.* Todos os métodos declarados pela interface  ``NotificationEmitter``  serão implementados, delegando um difusor de notificação. Um difusor de notificação simplifica a forma em que o MBean enviará notificações.
* *Selecione Gerar Número de Sequência Privada e Acessador.* Um código será gerado para tratar o valor do número de sequência exclusivo que deve ser adicionado a cada notificação enviada.
* *Clique em Adicionar Notificação.* Especifique os detalhes a seguir na tabela Notificações.
* Classe de Notificação:  ``javax.management.AttributeChangeNotification`` 
* Tipo de Notificação: (é definido automaticamente para  ``ATTRIBUTE_CHANGE`` )
* Descrição:  ``O Anagrama foi Resolvido`` 

image::images/jmx-changenotification.png[title="Adicionando notificação de alteração na caixa de diálogo Implementar NotificationEmitter"]

Clique em OK.

Você pode ver que o código necessário para implementar a interface  ``NotificationEmitter``  foi gerado na classe  ``AnagramsStats``  do MBean. Você pode ver como a implementação gerada delega o tratamento de notificações para a classe  ``NotificationBroadcasterSupport`` .



. Salve as alterações.

Neste exercício, você aprendeu a adicionar atributos, operações e emissão de notificações a um MBean usando o módulo Assistente JMX. As etapas necessárias para preencher seu MBean com a infraestrutura necessária para expor as informações de gerenciamento que você quer são finalizadas agora. Agora você precisa adicionar uma lógica interna à implementação da classe  ``AnagramsStats``  do MBean, em seguida, criar a ponte entre a aplicação MBean e o Jogo de Anagramas.


== Exercício 4: Adicionando o código de implementação ao MBean Padrão do JMX AnagramsStats

Neste exercício, você adicionará uma lógica interna à implementação da classe  ``AnagramsStats``  do MBean.

Execute as etapas a seguir para adicionar o código de implementação.

1. Os atributos já têm seus campos privados declarados e nada precisa ser adicionado a seus métodos getter.
2. O método  ``resetAll()``  precisa ser implementado. O corpo gerado está vazio. Quando  ``resetAll()``  é chamado, simplesmente definimos todos os contadores para 0. Adicione as seguintes linhas do código (em negrito) ao corpo do método  ``resetAll()`` :

[source,java]
----

public void resetAll() {
    *minThinkingTime = 0;
    maxThinkingTime = 0;
    lastThinkingTime = 0;
    numSolvedAnagrams = 0;*
}
----


. Você também precisa adicionar algum código de implementação que executará o seguinte:
* calcular o tempo de reflexão que o usuário levou para resolve o último anagrama,
* calcular os tempos mínimo e máximo de reflexão,
* incrementar o contador de anagramas resolvidos,
* saber que é o anagrama atual,
* criar e enviar a notificação quando um anagrama é resolvido.

Para esse objetivo, você adiciona um campo privado  ``startTime``  para armazenar o tempo no qual o último anagrama foi apresentado ao usuário, dois métodos  ``startThinking()``  e  ``stopThinking()``  para executar as operações listadas acima e um método  ``setCurrentAnagram()`` .

Adicione o seguinte código a  ``AnagramsStats.java`` ; por exemplo, no fim da implementação de classe.


[source,java]
----

/*
 * Methods exposed to Anagrams application to feed management with data.
 */

//Stores the time at which a new anagram is proposed to the user.
private long startTime;

/**
 * A new Anagram is proposed to the user: store current time.
 */
public void startThinking() {
    startTime = System.currentTimeMillis();
}

/**
 * An Anagram has been resolved.
 */
public void stopThinking() {

    //Update the number of resolved anagrams
    numSolvedAnagrams++;

    // Compute last, min and max thinking times
    lastThinkingTime = (int) (System.currentTimeMillis() - startTime) / 1000 ;
    minThinkingTime = (lastThinkingTime < minThinkingTime || minThinkingTime == 0) ?
                      lastThinkingTime :
                      minThinkingTime;
    maxThinkingTime = (lastThinkingTime > maxThinkingTime) ?
                      lastThinkingTime :
                      maxThinkingTime;

    //Create a JMX Notification
    Notification notification = new Notification(AttributeChangeNotification.ATTRIBUTE_CHANGE,
            this,
            getNextSeqNumber(),
            "Anagram solved: " + currentAnagram);

    // Send a JMX notification.
    broadcaster.sendNotification(notification);
}

/**
 * Set latest anagram which has been computed by the Anagram application
 */
public void setCurrentAnagram(String currentAnagram) {
    this.currentAnagram = currentAnagram;
}
----

Observe que os três métodos  ``startThinking()`` ,  ``stopThinking()``  e  ``setCurrentAnagram()``  não fazem parte da interface de gerenciamento do MBean porque eles não são declarados na interface  ``AnagramsStatsMBean`` , mas são públicos porque são chamados pela aplicação Jogo de Anagramas para informar ao MBean cada vez que um novo anagrama é apresentado ao usuário e quando é resolvido, e que é o anagrama atual. Dessa forma, eles são uma parte necessária da ponte entre a aplicação e nosso MBean.

Observe também como uma notificação JMX do tipo  ``ATTRIBUTE_CHANGE``  é enviada cada vez que um anagrama é resolvido.

Agora você concluiu a implementação do MBean. Nesta seção, você adicionou código e métodos para permitir o seguinte:

* atualizações de estado do MBean interno
* chamadas da aplicação
* envio de notificações do JMX


== Exercício 5: Estabelecendo Conexão ao Gerenciamento e à Aplicação Juntos

Neste exercício, vamos adicionar o código à aplicação Jogo de Anagramas, de forma que ele possa acessar o MBean para passar informações de gerenciamento.

Execute as seguintes etapas para

1. Abra  ``Anagrams.java``  no editor.

A classe  ``Anagrams``  no pacote  ``com.toy.anagrams.ui``  é a classe  ``main``  da aplicação de Jogos de Anagramas. O arquivo é aberto na view Design do Editor porque a classe  ``Anagrams``  também é a classe da Interface do Usuário.



. Clique no botão Código-fonte na parte superior da janela Editor para editar a classe na view Código-fonte.


. Adicione o seguinte método privado  ``initManagement()``  vazio para a classe  ``Anagrams`` : após o construtor  ``Anagrams`` .

[source,java]
----

/**
 * JMX initialization:
 * Create and register Anagrams MBean in Platform MBeanServer.
 * Initialize thinking time and current anagram.
 */
private void initManagement() throws Exception {

}
----


. Adicione a seguinte chamada ao método  ``initManagement()``  no fim do construtor da classe  ``Anagrams``  antes de a chave de fechamento marcar o fim do construtor.

[source,java]
----

//JMX Management initialization
initManagement();
          
----

Adicione também uma cláusula  ``throws Exception``  ao constructo  ``Anagrams()``  e envolva a instrução  ``new Anagrams().setVisible(true);``  com um bloco try/catch no método  ``Main()``  para compilação. Você poderá ver o glifo de sugestão na margem esquerda do editor. Coloque o cursor de inserção na linha do código e pressione Alt-Enter para chamar a dica de código no editor de código-fonte.

image::images/jmx-initmanagement-try.png[title="Dica de código para adicionar try-catch"]

Veja a seguir o que deverá ser exibido neste estágio [clique para exibir uma imagem maior]:

[.feature]
--
image:images/jmx-initmanagement-sm.png[role="left", link="images/jmx-initmanagement.png"]
--


. Agora vamos adicionar o código de registro do MBean ao método  ``initManagement()`` , usando o assistente de registro do MBean do Módulo JMX:

Na janela do editor do código-fonte  ``Anagrams.java`` , clique com o botão direito do mouse *no* corpo do método  ``initManagement()`` , selecione o submenu JMX e, em seguida, selecione a ação "Gerar Registro de MBean...". No painel "Instanciar e Registrar MBean", que é mostrado acima, mantenha o botão de opção "Registrar MBean Existente" selecionado, clique no botão Procurar ou escolha a classe  ``AnagramsStats``  do MBean e clique em OK no painel Procurar. Agora você deverá ver o seguinte:

image::images/jmx-registermbeandialog.png[]

Não é necessário alterar o Nome do Objeto e o Construtor do MBean especificados automaticamente. Clique em OK. Você verá o código de registro do MBean no corpo do método  ``initManagement()`` .


=== Melhor prática para nomear seus MBeans

* Ao nomear seu MBean, use a chave " ``type=`` " no Nome do Objeto. O valor desta chave deve ser a classe MBean (em nosso caso  ``AnagramsStats`` ).
* No caso de um MBean singleton (um MBean que tem uma instância única em sua aplicação), ter esta chave exclusiva é suficiente para fins de nomeação.
* Evita a criação de muitos nomes de domínio. Use seus nomes de pacote Java da aplicação. Você também pode usar o nome de domínio default: não especificar um domínio antes do separador  ``ObjectName``  " ``:`` " faz referência implicitamente ao domínio default.

A aplicação das melhores práticas fará com que o procedimento usado para nomear seus MBeans seja mais formalizado.

Dessa forma, o  ``ObjectName``  criado por default em nosso caso acima é:  ``com.toy.anagrams.mbeans:type=AnagramsStats`` 


No contexto deste tutorial, uma etapa extra é obrigatória. Você deseja que a aplicação tenha acesso à classe que implementa a interface de gerenciamento ( ``AnagramsStats`` ). Esta não é uma regra geral, mas ela pode ser útil quando sua aplicação precisar expandir dados para um MBean. Neste caso, os métodos  ``startThinking()`` ,  ``stopThinking()``  e  ``setCurrentAnagram()``  não são métodos de gerenciamento, mas são usados pela aplicação Jogo de Anagramas para notificar o MBeans que ocorreram alguns eventos. Por sua vez, o MBean atualiza seu estado. Para tornar o  ``AnagramsStats``  acessível da classe  ``Anagrams``  da IU, precisamos da classe  ``Anagrams``  para manter uma referência direta à instância do MBean  ``AnagramsStats`` .

Portanto, você precisa fazer as seguintes alterações no código do arquivo  ``Anagrams.java`` .



. Adicione o seguinte campo privado à classe  ``Anagrams`` .

[source,java]
----

    // Reference to the AnagramsStats MBean
    private AnagramsStats mbean;
    
----


. Inicialize a referência ao MBean  ``AnagramsStats``  no método  ``initManagement()``  modificando o código de Registro do MBean gerado, de forma que ele leia o seguinte:

[source,java]
----

private void initManagement() throws Exception {
    try { // Register MBean in Platform MBeanServer
         *mbean = new AnagramsStats();*
         ManagementFactory.getPlatformMBeanServer().
                registerMBean(*mbean*,
                new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
    } catch (JMException ex) {
        *ex.printStackTrace();*
}
----


. Inicialize o estado  ``AnagramsStats``  do MBean: quando a aplicação Jogo de Anagramas é iniciada, um anagrama é exibido imediatamente. Assim, é necessário informar ao MBean o valor da string do anagrama e começar a calcular o tempo de reflexão. Copie e cole as linhas abaixo no fim do método  ``initManagement()`` :

[source,java]
----

       // When the Anagrams game is first displayed, a word is proposed to the user.
       // We must start time computing and set the current anagram
       mbean.startThinking();
       mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
      
----

Veja a seguir o que deverá ser exibido neste estágio [clique para exibir uma imagem maior]:

[.feature]
--
image:images/jmx-initmanagement2-sm.png[role="left", link="images/jmx-initmanagement2.png"]
--

Agora você precisa adicionar o código para rastrear a experiência do usuário na resolução do anagrama.



. Localize o método  ``nextTrialActionPerformed()``  e cole o seguinte código no fim do método  ``nextTrialActionPerformed()`` .

[source,java]
----

    //Update management statistics and values
    try {
        mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
        mbean.startThinking();
        } catch (Exception e) {e.printStackTrace();}
----

Cada vez que um novo anagrama é proposto ao usuário, o código informa ao MBean qual é o anagrama e começa a contar o tempo de reflexão do usuário.



. Localize o método  ``guessedWordActionPerformed()``  e adicione as seguintes linhas ao código. Salve as alterações.

[source,java]
----

    //Update management stats
    try {
        mbean.stopThinking();
    } catch(Exception e) {e.printStackTrace();}
----

O método  ``stopThinking()``  no MBean é chamado cada vez que um anagrama é respondido corretamente.

Agora você deve ver o seguinte no editor [clique para exibir uma imagem maior]:

[.feature]
--
image:images/jmx-stopthinking-sm.png[role="left", link="images/jmx-stopthinking.png"]
--

Agora você terminou a vinculação à camada de gerenciamento JMX para a camada da aplicação. Na próxima seção, você criará e executará a aplicação Jogo de Anagramas e verificará as informações de gerenciamento expostas por meio da GUI JConsole.


== Exercício 6: Executando a Aplicação com JConsole

Neste exercício, você aprenderá a criar e executar seu projeto e estabelecerá conexão ao JConsole para visualizar o estado da JVM, bem como os MBeans da aplicação.

Execute as seguintes etapas para executar a aplicação e exibir as informações de gerenciamento.

1. Uma etapa única executa estas três tarefas: basta clicar no botão "Executar Projeto Principal com Monitoramento e Gerenciamento" na barra de ferramentas (  image::images/run-project24.png[title="Botão Executar Projeto Principal com Monitoramento e Gerenciamento"])

Você também pode chamar a ação do menu Executar no menu principal.

*Observação.* Na primeira vez que você constrói e executa a aplicação, o IDE exibe uma caixa de diálogo de advertência a qual informa que os arquivos  ``build.xml``  serão atualizados. Você pode clicar em OK na caixa de diálogo.

image::images/jmx-firsttime.png[title="Caixa de diálogo Advertência ao monitorar a aplicação pela primeira vez"]

Agora você pode seguir a execução na janela de Saída.

image::images/jmx-compiling.png[title="Janela de Saída que exibe o processo"]

O IDE construirá e iniciará o jogo de Anagramas e abrirá automaticamente a janela JConsole.

image::images/jmx-anagram.png[title="Jogo de Anagramas"]

*Observações.* É possível que você veja uma advertência de Falha de Conexão na Console de Monitoramento e Gerenciamento Java quando a console tenta estabelecer conexão com o processo do Jogo de Anagramas. Neste tutorial, você pode clicar em Não Seguro quando solicitado a autorizar a conexão.



. Selecione a guia MBeans na janela JConsole.


. No layout da árvore no painel esquerdo, expanda todos os nós em  ``com.toy.anagrams.mbeans`` . 
image::images/jmx-jconsole-mbeans1.png[title="Guia MBeans que mostra o nó AnagramsStats"]


. Selecione o nó Notificações e clique no botão Assinar na parte inferior, de forma que o JConsole recebem uma nova notificação cada vez que um anagrama é resolvido.


. Na janela Jogo de Anagramas, resolva os primeiros três ou quatro anagramas.

As soluções para os anagramas (abstração, ambíguos, aritmética, barra invertida,...) estão contidas na classe  ``WordLibrary`` .



. Na janela JConsole observe que ela recebeu notificações para cada uma das soluções. 
[.feature]
--
image::images/jmx-jconsole-mbeans2-sm.png[role="left", link="images/jmx-jconsole-mbeans2.png"]
--


. Clique no nó Atributos e observe que os valores do atributo estão atualizados: 
image::images/jmx-jconsole-mbeans3.png[title="Guia MBeans que mostra o nó AnagramsStats"]

Você pode experimentar a interface JConsole e o Jogo de Anagramas. Por exemplo, se você chamar a operação de gerenciamento  ``resetAll()``  verá que os valores do atributo do MBean são redefinidos como 0.

*Agora você terminou! Realmente você fez um bom trabalho. Parabéns! *

link:/about/contact_form.html?to=3&subject=Feedback:%20Adding%20Java%20Management%20Extensions%20(JMX)%20Instrumentation[+Enviar Feedback neste Tutorial+]



== Consulte Também

Para obter mais informações, consulte os seguintes tópicos:

* link:jmx-getstart.html[+Conceitos Básicos sobre Monitoramento do JMX no NetBeans IDE+]
