<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rafael Liu Blog &#187; jmx</title>
	<atom:link href="http://rafaelliu.net/tag/jmx/feed/" rel="self" type="application/rss+xml" />
	<link>http://rafaelliu.net</link>
	<description>Café, pinguins e outras coisas</description>
	<lastBuildDate>Wed, 28 Mar 2012 21:54:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>jboss.management.local:* already registered</title>
		<link>http://rafaelliu.net/2012/03/28/jboss-management-local-already-registered/</link>
		<comments>http://rafaelliu.net/2012/03/28/jboss-management-local-already-registered/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 21:54:28 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[JBoss]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jmx]]></category>
		<category><![CDATA[jrs77]]></category>
		<category><![CDATA[mbean]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=611</guid>
		<description><![CDATA[A exceção é da forma: javax.management.InstanceAlreadyExistsException: jboss.management.local:&#60;MBEAN NAME&#62; already registered. at org.jboss.mx.server.registry.BasicMBeanRegistry.add&#40;BasicMBeanRegistry.java:756&#41; at org.jboss.mx.server.registry.BasicMBeanRegistry.registerMBean&#40;BasicMBeanRegistry.java:233&#41; at sun.reflect.GeneratedMethodAccessor107.invoke&#40;Unknown Source&#41; at sun.reflect.DelegatingMethodAccessorImpl.invoke&#40;DelegatingMethodAccessorImpl.java:25&#41; at java.lang.reflect.Method.invoke&#40;Method.java:597&#41; at org.jboss.mx.interceptor.ReflectedDispatcher.invoke&#40;ReflectedDispatcher.java:157&#41; at org.jboss.mx.server.Invocation.dispatch&#40;Invocation.java:96&#41; at org.jboss.mx.interceptor.AbstractInterceptor.invoke&#40;AbstractInterceptor.java:138&#41; at org.jboss.mx.server.Invocation.invoke&#40;Invocation.java:90&#41; at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke&#40;ModelMBeanOperationInterceptor.java:140&#41; at org.jboss.mx.server.Invocation.invoke&#40;Invocation.java:90&#41; O JBoss, atendendo à JSR-77, registra sobre o domínio jboss.management.local todos os pacotes deployados. O problema ocorre quando dois pacotes com o [...]]]></description>
			<content:encoded><![CDATA[<p>A exceção é da forma:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">javax.<span style="color: #006633;">management</span>.<span style="color: #006633;">InstanceAlreadyExistsException</span><span style="color: #339933;">:</span> jboss.<span style="color: #006633;">management</span>.<span style="color: #006633;">local</span><span style="color: #339933;">:&lt;</span>MBEAN NAME<span style="color: #339933;">&gt;</span> already registered.
        <span style="color: #006633;">at</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">server</span>.<span style="color: #006633;">registry</span>.<span style="color: #006633;">BasicMBeanRegistry</span>.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>BasicMBeanRegistry.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">756</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">server</span>.<span style="color: #006633;">registry</span>.<span style="color: #006633;">BasicMBeanRegistry</span>.<span style="color: #006633;">registerMBean</span><span style="color: #009900;">&#40;</span>BasicMBeanRegistry.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">233</span><span style="color: #009900;">&#41;</span>
        at sun.<span style="color: #006633;">reflect</span>.<span style="color: #006633;">GeneratedMethodAccessor107</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>Unknown Source<span style="color: #009900;">&#41;</span>
        at sun.<span style="color: #006633;">reflect</span>.<span style="color: #006633;">DelegatingMethodAccessorImpl</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>DelegatingMethodAccessorImpl.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">25</span><span style="color: #009900;">&#41;</span>
        at java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">reflect</span>.<span style="color: #003399;">Method</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Method</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">597</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">interceptor</span>.<span style="color: #006633;">ReflectedDispatcher</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>ReflectedDispatcher.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">157</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">server</span>.<span style="color: #006633;">Invocation</span>.<span style="color: #006633;">dispatch</span><span style="color: #009900;">&#40;</span>Invocation.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">96</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">interceptor</span>.<span style="color: #006633;">AbstractInterceptor</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>AbstractInterceptor.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">138</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">server</span>.<span style="color: #006633;">Invocation</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>Invocation.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">90</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">interceptor</span>.<span style="color: #006633;">ModelMBeanOperationInterceptor</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>ModelMBeanOperationInterceptor.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">140</span><span style="color: #009900;">&#41;</span>
        at org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">mx</span>.<span style="color: #006633;">server</span>.<span style="color: #006633;">Invocation</span>.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>Invocation.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">90</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>O JBoss, atendendo à <a href="http://jcp.org/en/jsr/detail?id=77" target="_blank">JSR-77</a>, registra sobre o domínio jboss.management.local todos os pacotes deployados. O problema ocorre quando dois pacotes com o mesmo nome estão presentes. A princípio isso nunca aconteceria, os OS não permitem isso. Mas o JBoss tem a capacidade de fazer deploy de pastas aninhadas, além de poder ser configurado para possuir várias pastas de deploy.</p>
<p>Então a solução mais simples seria alterar o nome dos pacotes (pode ser também uma Persistence Unit ou qualquer outro deployable) conflitantes. Se essa não for uma opção, é possível também desabilitar a implementação JSR-77 do JBoss, que não deve trazer maiores consequências (a não ser que esses MBeans estejam sendo explicitamente usados).</p>
<p>Para tanto basta remover ou desabilitar (adicionando a extensão .rej) o arquivo <code>$JBOSS_CONF/deployers/jsr77-deployers-jboss-beans.xml</code></p>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2012/03/28/jboss-management-local-already-registered/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um MBean no JBoss</title>
		<link>http://rafaelliu.net/2009/08/20/criando-um-mbean-no-jboss/</link>
		<comments>http://rafaelliu.net/2009/08/20/criando-um-mbean-no-jboss/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 18:55:36 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[JBoss]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[jmx]]></category>
		<category><![CDATA[mbean]]></category>
		<category><![CDATA[microkernel]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=186</guid>
		<description><![CDATA[﻿A base do JBoss é o JBoss Microkernel que usa a especificação JMX (Java Management Extensions, JSR 003) através da qual módulos podem ser plugados através de MBeans. É assim que serviços de EJB, JMS, JTA, etc são providos no JBoss. MBeans são simplesmente especificações de interface. Desse modo podemos criar serviços, criar uma MBean [...]]]></description>
			<content:encoded><![CDATA[<p>﻿A base do JBoss é o JBoss Microkernel que usa a especificação JMX (Java Management Extensions, JSR 003) através da qual módulos podem ser plugados através de MBeans. É assim que serviços de EJB, JMS, JTA, etc são providos no JBoss.</p>
<p>MBeans são simplesmente especificações de interface. Desse modo podemos criar serviços, criar uma MBean que lhe servirá de <em>facade</em>, e fazer o deploy desse MBean no JBoss para expôr esse serviço. Para tanto basta o criar um arquivos <code>SAR</code> ou <code>*-service.xml</code> e fazer seu deploy.</p>
<p>Nesse post vamos criar MBean de exemplo. O exemplo é constituído de 3 coisas:</p>
<ol>
<li>Um arquivo <code>META-INF/jboss-service.xml</code> com a descrição do MBean</li>
<li>Uma interface <code>BackdoorServiceMBean</code></li>
<li>Uma classe <code>BackdoorService</code></li>
</ol>
<p>Tudo isso compilado em um <a href="http://rafaelliu.net/wp-content/uploads/2009/08/backdoorService.sar">backdoorService.sar</a> na seguinte estrutura:</p>
<p style="text-align: center;"><img class="size-medium wp-image-194 aligncenter" title="sar" src="http://rafaelliu.net/wp-content/uploads/2009/08/sar-300x165.png" alt="sar" width="300" height="165" /></p>
<p>A interface deve estende <code>ServiceMBean</code> (classe do JBoss) e seu nome deve terminar em MBean. Ela irá expor as propriedades e operações:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> BackdoorServiceMBean <span style="color: #000000; font-weight: bold;">extends</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">system</span>.<span style="color: #006633;">ServiceMBean</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> command<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> printAbout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getURL<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No exemplo são declaradas duas operações, <code>execute(String)</code> e <code>printAbout()</code>, e uma propriedade, <code>URL</code>.</p>
<p>Já a classe deve estende <code>ServiceMBeanSupport</code> (classe do JBoss) e implementar nossa interface <code>BackdoorServiceMBean</code>. Seu nome deve ser o mesmo da interface sem a terminação &#8220;MBean&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BackdoorService <span style="color: #000000; font-weight: bold;">extends</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">system</span>.<span style="color: #006633;">ServiceMBeanSupport</span> <span style="color: #000000; font-weight: bold;">implements</span> BackdoorServiceMBean <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> url<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> comando<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> buf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> len<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Process</span> proc <span style="color: #339933;">=</span> <span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span>comando<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>len <span style="color: #339933;">=</span> proc.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>buf, <span style="color: #cc66cc;">0</span>, len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> out.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> printAbout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;Visit &quot;</span> <span style="color: #339933;">+</span> url <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;!&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getURL<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> url<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">url</span> <span style="color: #339933;">=</span> url<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Por último o arquivo <code>META-INF/jboss-service.xml</code> onde deve constar o nome qualificado da classe MBean e o nome que identificará o MBean (por convenção é da forma <code>&lt;domínio&gt;:&lt;lista de atributos&gt;</code>). Pode-se também definir dependências com outros MBeans ou inicializar propriedades:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mbean</span> <span style="color: #000066;">code</span>=<span style="color: #ff0000;">&quot;net.rafaelliu.BackdoorService&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rafaelliu:service=BackdoorService&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;URL&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>http://rafaelliu.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attribute<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mbean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Testando nosso MBean, entramos em http://localhost:8080/jmx-console. Lá em baixo temos uma nova entrada:</p>
<p style="text-align: center;"><img class="size-medium wp-image-189 aligncenter" title="jmx-console" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-console-300x189.png" alt="jmx-console" width="300" height="189" /></p>
<p>Clicando no MBean, vemos a operação que definimos na interface. Vamos chamá-la com o argumento <code>ls /</code>:</p>
<p style="text-align: center;"><img class="size-medium wp-image-190 aligncenter" title="jmx-invoke" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-invoke-300x189.png" alt="jmx-invoke" width="300" height="189" /></p>
<p>Com isso temos o retorno:</p>
<p style="text-align: center;"><img class="size-medium wp-image-191 aligncenter" title="jmx-resultado" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-resultado-300x220.png" alt="jmx-resultado" width="300" height="220" /></p>
<p>Fácil, ahm?</p>
<h2>Moral da história</h2>
<p>Para quem nem o código Java nem o nome do serviço foi esclarecedor o suficiente, esse exemplo deve ter ajudado. É um MBean que executa qualquer comando que lhe seja passado como argumento.</p>
<p>Mas pera ai, posso executar qualquer comando mesmo? Até um <code>rm -rf /</code>? Sim. O detalhe é que o comando será executado com o mesmo usuário do JBoss (política de subprocessos do Linux), ou seja, a menos que o JBoss esteja sendo rodado como root, <code>rm -rf /</code> deverá resultar em erro de falta de privilégios.</p>
<p>Agora deve estar bem claro que é uma boa prática definir um usuário jboss com privilégios limitados para executar o processo do JBoss. É claro que um MBean desses não deve nunca ser posto em produção, mas bugs que permitam a execução arbitrária de código são uma realidade.</p>
<p>NOTAS:</p>
<ul>
<li>a versão utilizada foi a JBoss 4.2.3.GA</li>
<li>nas versões mais recentes substituído pelo JBoss Microcontainer que além de JMX faz deploy de POJO e OSGi</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2009/08/20/criando-um-mbean-no-jboss/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

