blob: d9c0f801e544fb0da667c84d1fcc61b8b45fc424 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>Adicionando Instrumentação do JMX (Java Management Extensions) à Aplicação Java no NetBeans IDE</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta name="description" content="Anagram Game JMX instrumentation tutorial for the NetBeans JMX Wizard module">
<link rel="stylesheet" href="../../../netbeans.css">
<meta name="TOPIC" content="ADVANCED">
<meta name="TYPE" content="ARTICLE">
<meta name="AUDIENCE" content="NBUSER">
<meta name="author" content="Jean-Francois DENISE">
<meta name="author" content="Joel FERAUD">
<meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION, JMX">
<meta name="description" content="An tutorial on how to add JMX management to an application in NetBeans IDE"/>
</head>
<body>
<h1>Adicionando Instrumentação do JMX (Java Management Extensions) à Aplicação Java</h1>
<center><b>Duração esperada: 60 minutos</b></center>
<p>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.</p>
<p>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. </p>
<h3>Exercícios do tutorial</h3>
<img alt="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0" class="stamp" src="../../../images_www/articles/73/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">
<ul>
<li><a href="#Exercise_1">Exercício 1: Criando o projeto de amostra do Jogo de Anagramas do NetBeans</a></li>
<li><a href="#Exercise_2">Exercício 2: Criando o MBean Padrão do JMX AnagramsStats e sua interface de Gerenciamento</a></li>
<li><a href="#Exercise_3">Exercício 3: Adicionando atributos, operação e notificação ao MBean Padrão JMX AnagramsStats</a></li>
<li><a href="#Exercise_4">Exercício 4: Adicionando o código de implementação ao MBean Padrão do JMX AnagramsStats</a></li>
<li><a href="#Exercise_5">Exercício 5: Estabelecendo conexão ao gerenciamento e à aplicação juntos</a></li>
<li><a href="#Exercise_6">Exercício 6: Executando o Jogo de Anagramas com JConsole</a></li>
</ul>
<h3>Pré-requisitos</h3>
<p>Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir ou alguma experiência de programação com elas: </p>
<ul>
<li>Tecnologia JMX: <a href="http://download.oracle.com/javase/6/docs/technotes/guides/jmx/index.html"> Documentação on-line do JMX</a></li>
<li>Tecnologia Java: <a href="http://www.oracle.com/technetwork/java/javase/tech/index.html"> Visão Geral das Tecnologias Java SE</a></li>
<li>NetBeans IDE</li>
</ul>
<p>Você também se beneficiará tendo conhecimento sobre<a href="http://download.oracle.com/javase/6/docs/technotes/guides/management/index.html"> Monitoramento e Gerenciamento da Plataforma Java</a></p>
<h3>Software Necessário para o Tutorial</h3>
<p>Para este tutorial, você precisa ter instalado no computador os seguintes softwares:</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software ou Recurso</th>
<th class="tblheader" scope="col">Versão Necessária</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">Versão Java 7.2, 7.3, 7.4, 8.0</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK (Java Development Kit)</a></td>
<td class="tbltd1">versão 7 ou 8</td>
</tr>
<tr>
<td class="tbltd1">Plug-in do JMX</td>
<td class="tbltd1">Disponível na Central de Atualização do NetBeans</td>
</tr>
<tr>
<td class="tbltd1">Plug-in de JConsole</td>
<td class="tbltd1">Disponível na Central de Atualização do NetBeans</td>
</tr>
</tbody>
</table>
<p>Para instalar os plug-ins <strong>JMX</strong> e <strong>JConsole</strong>, selecione Ferramentas > Plug-ins e faça download do módulo do Centro de Atualização do NetBeans.</p>
<h3>Recursos</h3>
<ul>
<li>Conteúdo de ajuda do NetBeans (Ajuda > Conteúdo de Ajuda > JMX). Esta ajuda também fica disponível nos Assistentes.</li>
</ul>
<h2><a name="Exercise_1"></a>Exercício 1: Criando o projeto de amostra do Jogo de Anagramas do NetBeans</h2>
<p>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. </p>
<ol>
<li>Selecione Arquivo > Novo Projeto (Ctrl-Shift-N).</li>
<li>Selecione a categoria Amostras > Java.</li>
<li>Selecione o projeto Jogo de Anagramas. Clique em Próximo.</li>
<li>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.
<p>Quando você clica em Finalizar, o IDE cria o projeto Jogo de Anagramas e exibe o projeto na janela Projetos.</p>
</li>
<li>Clique com o botão direito do mouse no projeto AnagramGame e selecione Propriedades.</li>
<li>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.
<p class="notes"><strong>Observação.</strong> 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.</li>
<li>Clique com o botão direito do mouse no nó de projeto Jogo de Anagramas e selecione Executar.</li>
</ol>
<p>Quando escolher Executar, o IDE compilará e acionará a aplicação Jogo de Anagramas.</p>
<h2><a name="Exercise_2"></a>Exercício 2: Criando o MBean Padrão do JMX AnagramsStats e sua interface de Gerenciamento</h2>
<p>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.</p>
<p>Execute as etapas a seguir para criar o MBean Padrão do JMX.</p>
<ol>
<li>Confirme se o projeto Jogo de Anagramas está definido como o projeto principal. </li>
<li>Escolha Arquivo > Novo Arquivo (Ctrl-N).</li>
<li>Na categoria JMX, selecione MBean Padrão. Clique em Próximo.<br /> <img alt="tela do tipo de arquivo MBean Padrão no Assistente Novo Arquivo" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newfile.png" title="Tipo de arquivo MBean Padrão no Assistente Novo Arquivo" /></li>
<li>Digite as seguintes informações no painel Nome e Localização:
<ul>
<li>Nome da Classe: <tt>AnagramsStats</tt></li>
<li>Localização: Pacotes de Origem (default)</li>
<li>Pacote: <tt>com.toy.anagrams.mbeans</tt></li>
<li>Descrição: <tt>Monitoramento e Gerenciamento do Jogo de Anagramas</tt></li>
</ul>
<br clear="all" /> <img alt="create_mbean2: criar novo MBean Padrão, etapa 2" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newmbean.png" />
</li>
<li>Clique em Finalizar.</li>
</ol>
<p>Quando você clicar em Finalizar, a classe <tt>AnagramsStats</tt> do MBean e a interface <tt>AnagramsStatsMBean</tt> do MBean são geradas no pacote <tt>com.toy.anagrams.mbeans</tt> do projeto AnagrmGame. Agora há vários esqueletos vazios que você preencherá no próximo exercício.</p>
<h2><a name="Exercise_3"></a>Exercício 3: Adicionando atributos, operação e notificação ao MBean Padrão JMX AnagramsStats</h2>
<p>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. </p>
<p>O MBean conterá o seguinte: </p>
<ul>
<li>Dois Atributos chamados <tt>LastThinkingTime</tt> e <tt>NumResolvedAnagrams</tt> </li>
<li>Uma Operação chamada <tt>resetAll</tt>. </li>
<li>Uma notificação do tipo <tt>AttributeChangeNotification</tt>. Esta notificação é emitida quando <tt>LastThinkingTime</tt> é atualizado.</li>
</ul>
<p>Execute as seguintes etapas para preencher o esqueleto do MBean.</p>
<ol>
<li>Abra o arquivo de implementação <tt>AnagramsStats.java</tt> do MBean no editor do NetBeans.</li>
<li>Clique com o botão direito do mouse no editor de código-fonte e selecione <strong>JMX > Adicionar Atributos de MBean</strong> no menu pop-up. </li>
<li>Adicione o atributo <tt>LastThinkingTime</tt> clicando no botão Adicionar Atributo e fornecendo as seguintes informações.
<ul>
<li>Nome do Atributo: <tt>LastThinkingTime</tt></li>
<li>Tipo: int</li>
<li>Acesso: Somente Leitura</li>
<li>Descrição: <tt>Tempo gasto para resolver o último anagrama</tt></li>
</ul>
<p class="notes"><strong>Observação.</strong> Não clique em OK ainda!</p>
</li>
<li>Clique em Adicionar Atributo novamente e adicione o seguinte atributo <tt>NumSolvedAnagrams</tt>. Clique em OK.
<ul>
<li>Nome do Atributo: <tt>NumSolvedAnagrams</tt></li>
<li>Tipo: int</li>
<li>Acesso: Somente Leitura</li>
<li>Descrição: <tt>Número de anagramas resolvidos</tt></li>
</ul>
<br /> <img alt="create_mbean7: Adicionar o atributo LastThinkingTime" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-addattribute.png" />
<p>O código necessário para expor os atributos <tt>LastThinkingTime</tt> e <tt>NumSolvedAnagrams</tt> somente para leitura é gerado na classe <tt>AnagramsStats</tt> do MBean e em sua interface.</p>
<p>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 <tt>getLastThinkingTime</tt> e <tt>getNumSolvedAnagrams</tt> são gerados na classe <tt>AnagramsStats</tt> e em sua interface <tt>AnagramsStatsMBean</tt>. Os campos privados <tt>lastThinkingTime</tt> e <tt>numSolvedAnagrams</tt> do tipo <tt>int</tt> também foram gerados e serão utilizados para armazenar os valores do atributo real.</p>
<p>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. </p>
</li>
<li>Clique com o botão direito do mouse no editor de código-fonte e selecione <strong>JMX > Adicionar Atributos de MBean</strong> no menu pop-up.</li>
<li>Clique no botão Adicionar Atributo e adicione os seguintes atributos.
<table border="1" cellpadding="1">
<thead>
<tr>
<th>Nome do Atributo</th>
<th>Tipo</th>
<th>Acesso</th>
<th>Descrição</th>
</tr>
</thead>
<tbody>
<tr>
<td>MinThinkingTime</td>
<td>int</td>
<td>Somente para Leitura</td>
<td>Tempo mínimo decorrido para resolver um anagrama</td>
</tr>
<tr>
<td>MaxThinkingTime</td>
<td>int</td>
<td>Somente para Leitura</td>
<td>Tempo máximo decorrido para resolver um anagrama</td>
</tr>
<tr>
<td>CurrentAnagram</td>
<td>String</td>
<td>Somente para Leitura</td>
<td>Anagrama atual para resolução</td>
</tr>
</tbody>
</table>
<p>A caixa de diálogo deve ser semelhante à seguinte imagem.</p>
<img alt="Tela da caixa de diálogo Adicionar Atributo após adicionar mais 3 atributos" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-addattribute2.png" title="Caixa de diálogo Adicionar Atributo após adicionar mais 3 atributos" />
<p class="notes"><strong>Observação.</strong> Observe que os atributos que você já criou estão listados na caixa de diálogo.</p>
</li>
<li>Clique em OK e salve suas alterações.</li>
<li>Clique com o botão direito do mouse no editor de código-fonte e selecione <strong>JMX > Adicionar Operações de MBean</strong> no menu pop-up.</li>
<li>Clique em Adicionar Operação e adicione a operação <tt>resetAll()</tt> e especifique os seguintes detalhes. Clique em OK.
<ul>
<li>Nome da Operação: <tt>resetAll</tt></li>
<li>Tipo de Retorno: <tt>void</tt></li>
<li>Parâmetros: (deixe vazia)</li>
<li>Exceções: (deixe vazia)</li>
<li>Descrição: <tt>Redefinir estado do MBean</tt></li>
</ul>
<br /> <img alt="Tela da caixa de diálogo Adicionar Operação" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-addoperation.png" title="Adicionando a operação resetAll na caixa de diálogo Adicionar Operação" />
<p>Depois de clicar em OK, você poderá ver se o código necessário para expor a operação <tt>resetAll</tt> foi gerado na classe <tt>AnagramsStats</tt> do MBean e em sua interface. </p>
</li>
<li>Clique com o botão direito do mouse no editor de código-fonte e selecione <strong>JMX > Interface Implementar NotificationEmitter</strong> no menu pop-up.</li>
<li>Especifique os seguintes detalhes na caixa de diálogo Implementar interface NotificationEmitter.
<ul>
<li><strong>Selecione Gerar Delegação para Difusor.</strong> Todos os métodos declarados pela interface <tt>NotificationEmitter</tt> serão implementados, delegando um difusor de notificação. Um difusor de notificação simplifica a forma em que o MBean enviará notificações.</li>
<li><strong>Selecione Gerar Número de Sequência Privada e Acessador.</strong> 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.</li>
<li><strong>Clique em Adicionar Notificação.</strong> Especifique os detalhes a seguir na tabela Notificações.
<ul>
<li>Classe de Notificação: <tt>javax.management.AttributeChangeNotification</tt></li>
<li>Tipo de Notificação: (é definido automaticamente para <tt>ATTRIBUTE_CHANGE</tt>)</li>
<li>Descrição: <tt>O Anagrama foi Resolvido</tt><br></li>
</ul>
</li>
</ul>
<br /> <img alt="Tela da caixa de diálogo Implementar NotificationEmitter" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-changenotification.png" title="Adicionando notificação de alteração na caixa de diálogo Implementar NotificationEmitter" />
<p>Clique em OK.</p>
<p>Você pode ver que o código necessário para implementar a interface <tt>NotificationEmitter</tt> foi gerado na classe <tt>AnagramsStats</tt> do MBean. Você pode ver como a implementação gerada delega o tratamento de notificações para a classe <tt>NotificationBroadcasterSupport</tt>.</p>
</li>
<li>Salve as alterações.</li>
</ol>
<p>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 <tt>AnagramsStats</tt> do MBean, em seguida, criar a ponte entre a aplicação MBean e o Jogo de Anagramas.</p>
<h2><a name="Exercise_4"></a>Exercício 4: Adicionando o código de implementação ao MBean Padrão do JMX AnagramsStats</h2>
<p>Neste exercício, você adicionará uma lógica interna à implementação da classe <tt>AnagramsStats</tt> do MBean. </p>
<p>Execute as etapas a seguir para adicionar o código de implementação.</p>
<ol>
<li>Os atributos já têm seus campos privados declarados e nada precisa ser adicionado a seus métodos getter.</li>
<li>O método <tt>resetAll()</tt> precisa ser implementado. O corpo gerado está vazio. Quando <tt>resetAll()</tt> é chamado, simplesmente definimos todos os contadores para 0. Adicione as seguintes linhas do código (em negrito) ao corpo do método <tt>resetAll()</tt>:
<pre>public void resetAll() {
<strong>minThinkingTime = 0;
maxThinkingTime = 0;
lastThinkingTime = 0;
numSolvedAnagrams = 0;</strong>
}</pre>
</li>
<li>Você também precisa adicionar algum código de implementação que executará o seguinte:
<ul>
<li>calcular o tempo de reflexão que o usuário levou para resolve o último anagrama,</li>
<li>calcular os tempos mínimo e máximo de reflexão,</li>
<li>incrementar o contador de anagramas resolvidos,</li>
<li>saber que é o anagrama atual,</li>
<li>criar e enviar a notificação quando um anagrama é resolvido.</li>
</ul>
<p>Para esse objetivo, você adiciona um campo privado <tt>startTime</tt> para armazenar o tempo no qual o último anagrama foi apresentado ao usuário, dois métodos <tt>startThinking()</tt> e <tt>stopThinking()</tt> para executar as operações listadas acima e um método <tt>setCurrentAnagram()</tt>.</p>
<p>Adicione o seguinte código a <tt>AnagramsStats.java</tt>; por exemplo, no fim da implementação de classe.
<pre class="examplecode">
/*
* 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;
}</pre>
<p>Observe que os três métodos <tt>startThinking()</tt>, <tt>stopThinking()</tt> e <tt>setCurrentAnagram()</tt> não fazem parte da interface de gerenciamento do MBean porque eles não são declarados na interface <tt>AnagramsStatsMBean</tt>, 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.</p>
<p>Observe também como uma notificação JMX do tipo <tt>ATTRIBUTE_CHANGE</tt> é enviada cada vez que um anagrama é resolvido. </p>
</li>
</ol>
<p>Agora você concluiu a implementação do MBean. Nesta seção, você adicionou código e métodos para permitir o seguinte:</p>
<ul>
<li>atualizações de estado do MBean interno</li>
<li>chamadas da aplicação</li>
<li>envio de notificações do JMX</li>
</ul>
<a name="Exercise_5"></a>
<h2>Exercício 5: Estabelecendo Conexão ao Gerenciamento e à Aplicação Juntos</h2>
<p>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.</p>
<p>Execute as seguintes etapas para</p>
<ol>
<li>Abra <tt>Anagrams.java</tt> no editor.
<p>A classe <tt>Anagrams</tt> no pacote <tt>com.toy.anagrams.ui</tt> é a classe <tt>main</tt> da aplicação de Jogos de Anagramas. O arquivo é aberto na view Design do Editor porque a classe <tt>Anagrams</tt> também é a classe da Interface do Usuário.</p></li>
<li>Clique no botão Código-fonte na parte superior da janela Editor para editar a classe na view Código-fonte.</li>
<li>Adicione o seguinte método privado <tt>initManagement()</tt> vazio para a classe <tt>Anagrams</tt>: após o construtor <tt>Anagrams</tt>.
<pre>
/**
* JMX initialization:
* Create and register Anagrams MBean in Platform MBeanServer.
* Initialize thinking time and current anagram.
*/
private void initManagement() throws Exception {
}</pre>
</li>
<li>Adicione a seguinte chamada ao método <tt>initManagement()</tt> no fim do construtor da classe <tt>Anagrams</tt> antes de a chave de fechamento marcar o fim do construtor.
<pre>
//JMX Management initialization
initManagement();
</pre>
<p>Adicione também uma cláusula <tt>throws Exception</tt> ao constructo <tt>Anagrams()</tt> e envolva a instrução <tt>new Anagrams().setVisible(true);</tt> com um bloco try/catch no método <tt>Main()</tt> 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.</p>
<img alt="dica de código para adicionar try-catch" class="margin-around b-all" src="../../../images_www/articles/80/java/jmx/jmx-initmanagement-try.png" title="Dica de código para adicionar try-catch">
<p>Veja a seguir o que deverá ser exibido neste estágio [clique para exibir uma imagem maior]:</p>
<a href="../../../images_www/articles/80/java/jmx/jmx-initmanagement.png" title="Anagrama do Instrumento 1 - clique para tela cheia"><img alt="instrument_anagram1: adicionando initManagement()" class="margin-around b-all" src="../../../images_www/articles/80/java/jmx/jmx-initmanagement-sm.png"></a>
</li>
<li>Agora vamos adicionar o código de registro do MBean ao método <tt>initManagement()</tt>, usando o assistente de registro do MBean do Módulo JMX:
<p>Na janela do editor do código-fonte <tt>Anagrams.java</tt>, clique com o botão direito do mouse <strong>no</strong> corpo do método <tt>initManagement()</tt>, 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 <tt>AnagramsStats</tt> do MBean e clique em OK no painel Procurar. Agora você deverá ver o seguinte:</p>
<img alt="create_mbean_registration: Gerar código de Registro do MBean" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-registermbeandialog.png">
<p>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 <tt>initManagement()</tt>.</p>
<hr style="width: 100%; height: 2px;" />
<h3>Melhor prática para nomear seus MBeans</h3>
<ul>
<li>Ao nomear seu MBean, use a chave "<tt>type=</tt>" no Nome do Objeto. O valor desta chave deve ser a classe MBean (em nosso caso <tt>AnagramsStats</tt>).
</li>
<li>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.
</li>
<li>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 <tt>ObjectName</tt> "<tt>:</tt>" faz referência implicitamente ao domínio default. </li>
</ul>
<p>A aplicação das melhores práticas fará com que o procedimento usado para nomear seus MBeans seja mais formalizado.</p>
<p>Dessa forma, o <tt>ObjectName</tt> criado por default em nosso caso acima é: <tt>com.toy.anagrams.mbeans:type=AnagramsStats</tt></p>
<hr style="width: 100%; height: 2px;"><br>
<p>No contexto deste tutorial, uma etapa extra é obrigatória. Você deseja que a aplicação tenha acesso à classe que implementa a interface de gerenciamento (<tt>AnagramsStats</tt>). 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 <tt>startThinking()</tt>, <tt>stopThinking()</tt> e <tt>setCurrentAnagram()</tt> 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 <tt>AnagramsStats</tt> acessível da classe <tt>Anagrams</tt> da IU, precisamos da classe <tt>Anagrams</tt> para manter uma referência direta à instância do MBean <tt>AnagramsStats</tt>.</p>
<p>Portanto, você precisa fazer as seguintes alterações no código do arquivo <tt>Anagrams.java</tt>.</p>
</li>
<li>Adicione o seguinte campo privado à classe <tt>Anagrams</tt>.
<pre>
// Reference to the AnagramsStats MBean
private AnagramsStats mbean;
</pre>
</li>
<li>Inicialize a referência ao MBean <tt>AnagramsStats</tt> no método <tt>initManagement()</tt> modificando o código de Registro do MBean gerado, de forma que ele leia o seguinte:
<pre>private void initManagement() throws Exception {
try { // Register MBean in Platform MBeanServer
<strong>mbean = new AnagramsStats();</strong>
ManagementFactory.getPlatformMBeanServer().
registerMBean(<strong>mbean</strong>,
new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
} catch (JMException ex) {
<strong>ex.printStackTrace();</strong>
}</pre>
</li>
<li>Inicialize o estado <tt>AnagramsStats</tt> 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 <tt>initManagement()</tt>:<br />
<pre>
// 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));
</pre>
<p>Veja a seguir o que deverá ser exibido neste estágio [clique para exibir uma imagem maior]:</p>
<a href="../../../images_www/articles/74/java/jmx/jmx-initmanagement2.png" title="Anagrama do Instrumento 2 - clique para tela cheia"><img alt="instrument_anagram1: adicionando initManagement()" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-initmanagement2-sm.png"></a>
<p>Agora você precisa adicionar o código para rastrear a experiência do usuário na resolução do anagrama.</p>
</li>
<li>Localize o método <tt>nextTrialActionPerformed()</tt> e cole o seguinte código no fim do método <tt>nextTrialActionPerformed()</tt>.
<pre class="examplecode">
//Update management statistics and values
try {
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
mbean.startThinking();
} catch (Exception e) {e.printStackTrace();}</pre>
<p>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.</p>
</li>
<li>Localize o método <tt>guessedWordActionPerformed()</tt> e adicione as seguintes linhas ao código. Salve as alterações.
<pre class="examplecode">
//Update management stats
try {
mbean.stopThinking();
} catch(Exception e) {e.printStackTrace();}</pre>
<p>O método <tt>stopThinking()</tt> no MBean é chamado cada vez que um anagrama é respondido corretamente.</p>
<p>Agora você deve ver o seguinte no editor [clique para exibir uma imagem maior]:</p>
<a href="../../../images_www/articles/74/java/jmx/jmx-stopthinking.png" title="Anagrama do Instrumento 3 - clique para tela cheia"><img alt="instrument_anagram3: chamar métodos de MBean" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-stopthinking-sm.png"></a>
</li>
</ol>
<p>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.</p>
<a name="Exercise_6"></a>
<h2>Exercício 6: Executando a Aplicação com JConsole</h2>
<p>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. </p>
<p>Execute as seguintes etapas para executar a aplicação e exibir as informações de gerenciamento.</p>
<ol>
<li>Uma etapa única executa estas três tarefas: basta clicar no botão "Executar Projeto Principal com Monitoramento e Gerenciamento" na barra de ferramentas (&nbsp; <img alt="Botão Executar Projeto Principal com Monitoramento e Gerenciamento na barra de ferramentas" src="../../../images_www/articles/74/java/jmx/run-project24.png" title="Botão Executar Projeto Principal com Monitoramento e Gerenciamento" />)
<p class="tips">Você também pode chamar a ação do menu Executar no menu principal.</p>
<p class="notes"><strong>Observação.</strong> 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 <tt>build.xml</tt> serão atualizados. Você pode clicar em OK na caixa de diálogo.</p>
<img alt="tela da caixa de diálogo de advertência" class="margin-around" src="../../../images_www/articles/74/java/jmx/jmx-firsttime.png" title="Caixa de diálogo Advertência ao monitorar a aplicação pela primeira vez" />
<p>Agora você pode seguir a execução na janela de Saída.</p>
<img alt="tela da janela de Saída" class="margin-around" src="../../../images_www/articles/74/java/jmx/jmx-compiling.png" title="Janela de Saída que exibe o processo" />
<p>O IDE construirá e iniciará o jogo de Anagramas e abrirá automaticamente a janela JConsole.</p>
<img alt="tela do Jogo de Anagramas" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-anagram.png" title="Jogo de Anagramas" />
<p class="notes"><strong>Observações.</strong> É 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.</p>
</li>
<li>Selecione a guia MBeans na janela JConsole.</li>
<li>No layout da árvore no painel esquerdo, expanda todos os nós em <tt>com.toy.anagrams.mbeans</tt>. <br /> <img alt="tela da guia MBeans que mostra o nó AnagramsStats" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans1.png" title="Guia MBeans que mostra o nó AnagramsStats" />
</li>
<li>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.</li>
<li>Na janela Jogo de Anagramas, resolva os primeiros três ou quatro anagramas.
<p class="tips">As soluções para os anagramas (abstração, ambíguos, aritmética, barra invertida,...) estão contidas na classe <tt>WordLibrary</tt>.</p></li>
<li>Na janela JConsole observe que ela recebeu notificações para cada uma das soluções. <br /> <a href="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans2.png" title="Clique para aumentar"> <img alt="tela da guia MBeans que mostra o nó AnagramsStats" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans2-sm.png" title="Guia MBeans que mostra o nó AnagramsStats" /></a>
</li>
<li>Clique no nó Atributos e observe que os valores do atributo estão atualizados: <br /> <img alt="tela da guia MBeans que mostra o nó AnagramsStats" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jconsole-mbeans3.png" title="Guia MBeans que mostra o nó AnagramsStats" />
<p>Você pode experimentar a interface JConsole e o Jogo de Anagramas. Por exemplo, se você chamar a operação de gerenciamento <tt>resetAll()</tt> verá que os valores do atributo do MBean são redefinidos como 0.</p></li>
</ol>
<p><strong>Agora você terminou! Realmente você fez um bom trabalho. Parabéns! </strong></p>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Adding%20Java%20Management%20Extensions%20(JMX)%20Instrumentation">Enviar Feedback neste Tutorial</a></div>
<br style="clear:both;">
<h2>Consulte Também</h2>
<p>Para obter mais informações, consulte os seguintes tópicos:</p>
<ul>
<li><a href="jmx-getstart.html">Conceitos Básicos sobre Monitoramento do JMX no NetBeans IDE</a></li>
</ul>
</body>
</html>