MouseOver Studio

MouseOver Studio header image 2

Gerenciando MBeans via JMX API

setembro 17th, 2008 por Diego Carrion · 5 comentários

Muitas vezes, por algum motivo ou outro, desejamos realizar alguma operação num certo Mbean, como dar um stop, um start ou simplesmente mudar algum atributo.

Para quem nunca realizou a atividade e estiver procurando algum artigo ou tutorial em português, a primeira vez pode ser muito complicada devido à falta de exemplos; depois da primeira vez é só seguir a receita do bolo.

Vou postar aqui um exemplo de como criar uma conexão com um servidor de MBeans e invocar um método num Mbean determinado. No exemplo vou demonstrar como utilizar a API do JMX para cumprir nossos objetivos, mas para que a demonstração seja um pouco mais interessante, vou chamar a API a partir da linguagem Ruby, poder que o JRuby nos proporciona.

require "java"

import java.util.HashMap

import javax.management.MBeanServerConnection
import javax.management.ObjectName
import javax.management.remote.JMXConnector
import javax.management.remote.JMXConnectorFactory
import javax.management.remote.JMXServiceURL

environment = HashMap.new
credentials = ["system", "manager"].to_java
environment.put(JMXConnector::CREDENTIALS, credentials)
address = JMXServiceURL.new("service:jmx:rmi:///jndi/rmi://mouseoverstudio.com/JMXConnector")
connector = JMXConnectorFactory.connect(address, environment)
connection = connector.getMBeanServerConnection
name = "geronimo:J2EEServer=geronimo,name=com.mouseoverstudio/ejb-app/2.0.0.2/jar,J2EEApplication=null,j2eeType=EJBModule"
obj = ObjectName.new(name)
connection.invoke(obj, "doStop", nil, nil)

O que basicamente fazemos no código é criar um HashMap onde proximamente colocamos um array com nossas credenciais, as quais irão ser utilizadas na hora de realizar a conexão com o servidor. Na seguinte linha criamos um endereço da localização de serviço JMX (mais detalhes aqui) e continuamente utilizamos esse endereço, junto com os credenciais, para criar uma conexão com o serviço.

Uma vez estabelecida a conexão com o serviço JMX, solicitamos uma conexão com o servidor de MBeans e indicamos que queremos executar o método doStop no objeto com o nome indicado pela variável name. Esse objeto representa um MBean no servidor.

Para conhecer o nome do MBean que desejam gerenciar podem acessar o console JMX do servidor sento utilizado. Para realizar esse exemplo eu utilizei o Geronimo (como podem apreciar no nome do MBean), mas o mesmo console existe também tanto como para JBoss como para Glassfish.

Caso a operação invoke precise de parâmetros, podemos indicar eles no terceiro parâmetro do método invoke, passando eles como um array de objetos. Eu não entendo direito o quarto parâmetro (talvez porque nunca precisei utilizar ele) e por tal motivo não vou dizer para que eu acho que existe, devido a que posso terminar confundindo alguém. O mais seguro é que vocês também não precisem utilizar ele, mas se alguem conhece bem sua funcionalidade, por favor me explique!

Tags: java · jmx · jruby · mbean · mbeans · ruby

5 respostas ate agora ↓

  • 1 Leandro // set 17, 2008 at 7:22 pm

    heheheh… que barato, cara… agora à tarde estava pensando em fazer um post exatamente sobre esse assunto… :)

  • 2 Paulo Cassiano // set 18, 2008 at 12:15 am

    O conteúdo do teu blog me pareceu muito bom, porém senti falta de “mais cores”… 😉

  • 3 Diego Carrion // set 18, 2008 at 11:19 am

    @Leandro

    hahahha agora eu sei que não sou o único que passa por essas coisas 😛

    @Paulo

    Obrigado pelas criticas, ja faz um tempo estou pensando em dar uma atualizada no visual do blog, agora surgiu uma motivação a mais 😀

  • 4 Eamonn McManus // set 19, 2008 at 9:14 am

    Hi,

    Sorry for writing in English, but my Portuguese is not the best. Thank goodness for Google Translate.

    If you are invoking an operation with parameters, then you must provide non-null values for the third and fourth parameters of “invoke”. The third parameter is the array of arguments. The fourth parameter is the “signature”, an array of strings of the same length as the array of arguments. This is needed in case you have overloaded operations, for example start(String) and start(int).

    Mostly we recommend that people invoke operations through proxies instead; see JMX.newMBeanProxy in Java 6, or MBeanServerInvocationHandler.newProxyInstance in Java 5. That allows you to write proxy.start(“foo”) instead of connection.invoke(objectName, “start”, new Object[] {“foo”}, new String[] {String.class.getName()}). I am not sure how that translates into Ruby, though.

  • 5 Diego Carrion // set 19, 2008 at 10:52 am

    @Eamon

    Thank you so much for the feedback. I will update the post with the usage of the signature parameter.

    Also, its good to know about the MBean Proxy. I think nobody has talk about it here in Brazil, so I will take the oportunity of doing it.

Deixar um comentário