<dependency> <groupId>org.apache.openejb</groupId> <artifactId>mbean-annotation-api</artifactId> <version>4.5.0</version> <scope>provided</scope> </dependency>
Registro automático do Mbean
Este exemplo mostra como criar e registrar automaticamente Mbeans usando features do TomEE.
Dependências
Para poder usá-lo, você precisa importar a API do mbean (anotações):
O MBean
O mbean implementa um jogo simples em que o objetivo é adivinhar um número.
Também permite que o usuário altere o valor.
package org.superbiz.mbean; import javax.management.Description; import javax.management.MBean; import javax.management.ManagedAttribute; import javax.management.ManagedOperation; @MBean @Description("play with me to guess a number") public class GuessHowManyMBean { private int value = 0; @ManagedAttribute @Description("you are cheating!") public int getValue() { return value; } @ManagedAttribute public void setValue(int value) { this.value = value; } @ManagedOperation public String tryValue(int userValue) { if (userValue == value) { return "winner"; } return "not the correct value, please have another try"; } }
Para registrar um MBean, basta especificar uma propriedade em system.properties ou nas propriedades do contexto inicial.
Properties properties = new Properties(); properties.setProperty("openejb.user.mbeans.list", GuessHowManyMBean.class.getName()); EJBContainer.createEJBContainer(properties);
Acessando o MBean
Em seguida, basta obter o servidor da plataforma e você pode jogar com parâmetros e operações:
package org.superbiz.mbean; import org.junit.Test; import jakarta.ejb.embeddable.EJBContainer; import javax.management.Attribute; import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; import java.util.Properties; import static junit.framework.Assert.assertEquals; public class GuessHowManyMBeanTest { private static final String OBJECT_NAME = "openejb.user.mbeans:group=org.superbiz.mbean,application=mbean-auto-registration,name=GuessHowManyMBean"; @Test public void play() throws Exception { Properties properties = new Properties(); properties.setProperty("openejb.user.mbeans.list", GuessHowManyMBean.class.getName()); EJBContainer container = EJBContainer.createEJBContainer(properties); MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName = new ObjectName(OBJECT_NAME); MBeanInfo infos = server.getMBeanInfo(objectName); assertEquals(0, server.getAttribute(objectName, "value")); server.setAttribute(objectName, new Attribute("value", 3)); assertEquals(3, server.getAttribute(objectName, "value")); assertEquals("winner", server.invoke(objectName, "tryValue", new Object[]{3}, null)); assertEquals("not the correct value, please have another try", server.invoke(objectName, "tryValue", new Object[]{2}, null)); container.close(); } }
Nota
Se o OpenEJB não encontrar nenhum módulo, ele não poderá ser iniciado. Então, para forçá-lo a iniciar, mesmo que o exemplo tenha apenas o mbean como classe java, adicionamos um arquivo beans.xml
para transformar nosso projeto em um módulo Java EE.
Executando
------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.superbiz.mbean.GuessHowManyMBeanTest Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 http://tomee.apache.org/ INFO - openejb.home = /Users/dblevins/examples/mbean-auto-registration INFO - openejb.base = /Users/dblevins/examples/mbean-auto-registration INFO - Using 'jakarta.ejb.embeddable.EJBContainer=true' INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) INFO - Found EjbModule in classpath: /Users/dblevins/examples/mbean-auto-registration/target/classes INFO - Beginning load: /Users/dblevins/examples/mbean-auto-registration/target/classes INFO - Configuring enterprise application: /Users/dblevins/examples/mbean-auto-registration INFO - MBean openejb.user.mbeans:application=,group=org.superbiz.mbean,name=GuessHowManyMBean registered. INFO - MBean openejb.user.mbeans:application=mbean-auto-registration,group=org.superbiz.mbean,name=GuessHowManyMBean registered. INFO - MBean openejb.user.mbeans:application=EjbModule1847652919,group=org.superbiz.mbean,name=GuessHowManyMBean registered. INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) INFO - Auto-creating a container for bean mbean-auto-registration.Comp: Container(type=MANAGED, id=Default Managed Container) INFO - Enterprise application "/Users/dblevins/examples/mbean-auto-registration" loaded. INFO - Assembling app: /Users/dblevins/examples/mbean-auto-registration INFO - Jndi(name="java:global/mbean-auto-registration/mbean-auto-registration.Comp!org.apache.openejb.BeanContext$Comp") INFO - Jndi(name="java:global/mbean-auto-registration/mbean-auto-registration.Comp") INFO - Jndi(name="java:global/EjbModule1847652919/org.superbiz.mbean.GuessHowManyMBeanTest!org.superbiz.mbean.GuessHowManyMBeanTest") INFO - Jndi(name="java:global/EjbModule1847652919/org.superbiz.mbean.GuessHowManyMBeanTest") INFO - Created Ejb(deployment-id=mbean-auto-registration.Comp, ejb-name=mbean-auto-registration.Comp, container=Default Managed Container) INFO - Created Ejb(deployment-id=org.superbiz.mbean.GuessHowManyMBeanTest, ejb-name=org.superbiz.mbean.GuessHowManyMBeanTest, container=Default Managed Container) INFO - Started Ejb(deployment-id=mbean-auto-registration.Comp, ejb-name=mbean-auto-registration.Comp, container=Default Managed Container) INFO - Started Ejb(deployment-id=org.superbiz.mbean.GuessHowManyMBeanTest, ejb-name=org.superbiz.mbean.GuessHowManyMBeanTest, container=Default Managed Container) INFO - Deployed Application(path=/Users/dblevins/examples/mbean-auto-registration) INFO - Undeploying app: /Users/dblevins/examples/mbean-auto-registration Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.063 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0