You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by GitBox <gi...@apache.org> on 2020/08/12 20:35:28 UTC

[GitHub] [tomee] hbelmiro commented on a change in pull request #700: TOMEE-2891 Translate to Portuguese: examples/resources-jmx-example

hbelmiro commented on a change in pull request #700:
URL: https://github.com/apache/tomee/pull/700#discussion_r469516736



##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.

Review comment:
       You forgot to remove this lines.

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.

Review comment:
       ```suggestion
   ao recurso. Depois que o recurso for criado e vinculado à árvore JNDI do TomEE, a fábrica não é mais usada.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.

Review comment:
       ```suggestion
   Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir a especificação de MBean.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.

Review comment:
       ```suggestion
   para saber qual classe criar e o nome JMX sob o qual será registrada.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.
+
+== Usando o @Resource para injeção
+
+O caso de teste para este exemplo demonstra a injeção em um EJB como uma maneira de acessar o recurso e também acessar o recurso via JMX.
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class JMXTest {
+
+    @EJB
+    private TestEjb ejb;
+
+    @Deployment
+    public static EnterpriseArchive createDeployment() {
+
+        final JavaArchive ejbJar = new Mvn.Builder()
+                .name("jmx-ejb.jar")
+                .build(JavaArchive.class)
+                .addClass(JMXTest.class)
+                .addClass(TestEjb.class);
+
+        final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
+                .addAsModule(ejbJar);
+
+        return ear;
+    }
+
+    @Test
+    public void test() throws Exception {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
+
+        Assert.assertNotNull(ejb);
+    
+        Assert.assertEquals(0, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(0, ejb.getCount());
+    
+        mbs.invoke(objectName, "increment", new Object[0], new String[0]);
+        Assert.assertEquals(1, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(1, ejb.getCount());
+    
+        ejb.increment();
+        Assert.assertEquals(2, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(2, ejb.getCount());
+
+        Attribute attribute = new Attribute("Count", 12345);
+        mbs.setAttribute(objectName, attribute);
+        Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(12345, ejb.getCount());
+    
+        ejb.setCount(23456);
+        Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(23456, ejb.getCount());
+
+        Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[] { "world" }, new String[] { String.class.getName() }));
+        Assert.assertEquals("Hello, world", ejb.greet("world"));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    public static class TestEjb {
+
+        @Resource(name="jmx/Hello")
+        private HelloMBean helloMBean;
+
+        public String greet(String name) {
+            return helloMBean.greet(name);
+        }
+
+        public void setCount(int count) {
+            helloMBean.setCount(count);
+        }
+
+        public void increment() {
+            helloMBean.increment();
+        }
+
+        public int getCount() {
+            return helloMBean.getCount();
+        }
+    }
+}
+----
+
+O atributo name `<name>/<resource-id>`é usado na anotação `@Resource` para executar a injeção. Nenhuma configuração adicional é necessária para injetar o recurso.
+
+== Propriedades adicionais
+
+Além das propriedades `code` e `name` que o código acima usa para instanciar o recurso, o próprio TomEE fornece algumas propriedades para fornecer mais controle sobre a criação de recursos.
+
+Os recursos são normalmente descobertos, criados e vinculados ao
+JNDI muito cedo no processo de implementação, pois outros componentes dependem deles. Isso pode levar a problemas nos quais o classpath final da aplicação ainda não foi determinado e, portanto, o TomEE não pode carregar seu recurso personalizado.
+
+As seguintes propriedades podem ser usadas para alterar esse comportamento.
+
+* Lazy
+
+é um valor booleano que, quando verdadeiro, cria um proxy que adia
+a instanciação real do recurso até a primeira vez que ele olhou para cima do JNDI. 

Review comment:
       ```suggestion
   a instanciação real do recurso até a primeira vez que ele é procurado pelo JNDI. 
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.
+
+== Usando o @Resource para injeção
+
+O caso de teste para este exemplo demonstra a injeção em um EJB como uma maneira de acessar o recurso e também acessar o recurso via JMX.
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class JMXTest {
+
+    @EJB
+    private TestEjb ejb;
+
+    @Deployment
+    public static EnterpriseArchive createDeployment() {
+
+        final JavaArchive ejbJar = new Mvn.Builder()
+                .name("jmx-ejb.jar")
+                .build(JavaArchive.class)
+                .addClass(JMXTest.class)
+                .addClass(TestEjb.class);
+
+        final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
+                .addAsModule(ejbJar);
+
+        return ear;
+    }
+
+    @Test
+    public void test() throws Exception {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
+
+        Assert.assertNotNull(ejb);
+    
+        Assert.assertEquals(0, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(0, ejb.getCount());
+    
+        mbs.invoke(objectName, "increment", new Object[0], new String[0]);
+        Assert.assertEquals(1, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(1, ejb.getCount());
+    
+        ejb.increment();
+        Assert.assertEquals(2, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(2, ejb.getCount());
+
+        Attribute attribute = new Attribute("Count", 12345);
+        mbs.setAttribute(objectName, attribute);
+        Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(12345, ejb.getCount());
+    
+        ejb.setCount(23456);
+        Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(23456, ejb.getCount());
+
+        Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[] { "world" }, new String[] { String.class.getName() }));
+        Assert.assertEquals("Hello, world", ejb.greet("world"));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    public static class TestEjb {
+
+        @Resource(name="jmx/Hello")
+        private HelloMBean helloMBean;
+
+        public String greet(String name) {
+            return helloMBean.greet(name);
+        }
+
+        public void setCount(int count) {
+            helloMBean.setCount(count);
+        }
+
+        public void increment() {
+            helloMBean.increment();
+        }
+
+        public int getCount() {
+            return helloMBean.getCount();
+        }
+    }
+}
+----
+
+O atributo name `<name>/<resource-id>`é usado na anotação `@Resource` para executar a injeção. Nenhuma configuração adicional é necessária para injetar o recurso.
+
+== Propriedades adicionais
+
+Além das propriedades `code` e `name` que o código acima usa para instanciar o recurso, o próprio TomEE fornece algumas propriedades para fornecer mais controle sobre a criação de recursos.
+
+Os recursos são normalmente descobertos, criados e vinculados ao
+JNDI muito cedo no processo de implementação, pois outros componentes dependem deles. Isso pode levar a problemas nos quais o classpath final da aplicação ainda não foi determinado e, portanto, o TomEE não pode carregar seu recurso personalizado.
+
+As seguintes propriedades podem ser usadas para alterar esse comportamento.
+
+* Lazy
+
+é um valor booleano que, quando verdadeiro, cria um proxy que adia
+a instanciação real do recurso até a primeira vez que ele olhou para cima do JNDI. 
+Isso pode ser útil se o recurso exigir o classpath da aplicação ou para melhorar o tempo de inicialização não totalmente inicializando recursos que podem não ser usados.
+
+* UseAppClassLoader
+
+Esse valor booleano força um recurso instanciado Lazy a usar o
+classloaders da aplicação, em vez do classloader disponível quando o
+os recursos foram processados primeiro.

Review comment:
       ```suggestion
   classloaders da aplicação, em vez do classloader disponível quando
   os recursos foram processados primeiro.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.
+
+== Usando o @Resource para injeção
+
+O caso de teste para este exemplo demonstra a injeção em um EJB como uma maneira de acessar o recurso e também acessar o recurso via JMX.
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class JMXTest {
+
+    @EJB
+    private TestEjb ejb;
+
+    @Deployment
+    public static EnterpriseArchive createDeployment() {
+
+        final JavaArchive ejbJar = new Mvn.Builder()
+                .name("jmx-ejb.jar")
+                .build(JavaArchive.class)
+                .addClass(JMXTest.class)
+                .addClass(TestEjb.class);
+
+        final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
+                .addAsModule(ejbJar);
+
+        return ear;
+    }
+
+    @Test
+    public void test() throws Exception {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
+
+        Assert.assertNotNull(ejb);
+    
+        Assert.assertEquals(0, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(0, ejb.getCount());
+    
+        mbs.invoke(objectName, "increment", new Object[0], new String[0]);
+        Assert.assertEquals(1, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(1, ejb.getCount());
+    
+        ejb.increment();
+        Assert.assertEquals(2, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(2, ejb.getCount());
+
+        Attribute attribute = new Attribute("Count", 12345);
+        mbs.setAttribute(objectName, attribute);
+        Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(12345, ejb.getCount());
+    
+        ejb.setCount(23456);
+        Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(23456, ejb.getCount());
+
+        Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[] { "world" }, new String[] { String.class.getName() }));
+        Assert.assertEquals("Hello, world", ejb.greet("world"));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    public static class TestEjb {
+
+        @Resource(name="jmx/Hello")
+        private HelloMBean helloMBean;
+
+        public String greet(String name) {
+            return helloMBean.greet(name);
+        }
+
+        public void setCount(int count) {
+            helloMBean.setCount(count);
+        }
+
+        public void increment() {
+            helloMBean.increment();
+        }
+
+        public int getCount() {
+            return helloMBean.getCount();
+        }
+    }
+}
+----
+
+O atributo name `<name>/<resource-id>`é usado na anotação `@Resource` para executar a injeção. Nenhuma configuração adicional é necessária para injetar o recurso.
+
+== Propriedades adicionais
+
+Além das propriedades `code` e `name` que o código acima usa para instanciar o recurso, o próprio TomEE fornece algumas propriedades para fornecer mais controle sobre a criação de recursos.
+
+Os recursos são normalmente descobertos, criados e vinculados ao
+JNDI muito cedo no processo de implementação, pois outros componentes dependem deles. Isso pode levar a problemas nos quais o classpath final da aplicação ainda não foi determinado e, portanto, o TomEE não pode carregar seu recurso personalizado.
+
+As seguintes propriedades podem ser usadas para alterar esse comportamento.
+
+* Lazy
+
+é um valor booleano que, quando verdadeiro, cria um proxy que adia
+a instanciação real do recurso até a primeira vez que ele olhou para cima do JNDI. 
+Isso pode ser útil se o recurso exigir o classpath da aplicação ou para melhorar o tempo de inicialização não totalmente inicializando recursos que podem não ser usados.
+
+* UseAppClassLoader
+
+Esse valor booleano força um recurso instanciado Lazy a usar o
+classloaders da aplicação, em vez do classloader disponível quando o
+os recursos foram processados primeiro.
+
+* InitializeAfterDeployment
+
+Essa configuração booleana força um recurso criado com a propriedade Lazy a ser instanciado depois que a aplicação é iniciado, em vez de esperar que ele seja procurado. Use esse sinalizador se precisar que o recurso seja carregado,independentemente de ser injetado em um componente gerenciado ou consultado manualmente.

Review comment:
       ```suggestion
   Essa configuração booleana força um recurso criado com a propriedade Lazy a ser instanciado depois que a aplicação é iniciada, em vez de esperar que ele seja procurado. Use esse sinalizador se precisar que o recurso seja carregado, independentemente de ser injetado em um componente gerenciado ou consultado manualmente.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.
+
+== Usando o @Resource para injeção
+
+O caso de teste para este exemplo demonstra a injeção em um EJB como uma maneira de acessar o recurso e também acessar o recurso via JMX.
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class JMXTest {
+
+    @EJB
+    private TestEjb ejb;
+
+    @Deployment
+    public static EnterpriseArchive createDeployment() {
+
+        final JavaArchive ejbJar = new Mvn.Builder()
+                .name("jmx-ejb.jar")
+                .build(JavaArchive.class)
+                .addClass(JMXTest.class)
+                .addClass(TestEjb.class);
+
+        final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
+                .addAsModule(ejbJar);
+
+        return ear;
+    }
+
+    @Test
+    public void test() throws Exception {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
+
+        Assert.assertNotNull(ejb);
+    
+        Assert.assertEquals(0, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(0, ejb.getCount());
+    
+        mbs.invoke(objectName, "increment", new Object[0], new String[0]);
+        Assert.assertEquals(1, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(1, ejb.getCount());
+    
+        ejb.increment();
+        Assert.assertEquals(2, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(2, ejb.getCount());
+
+        Attribute attribute = new Attribute("Count", 12345);
+        mbs.setAttribute(objectName, attribute);
+        Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(12345, ejb.getCount());
+    
+        ejb.setCount(23456);
+        Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(23456, ejb.getCount());
+
+        Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[] { "world" }, new String[] { String.class.getName() }));
+        Assert.assertEquals("Hello, world", ejb.greet("world"));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    public static class TestEjb {
+
+        @Resource(name="jmx/Hello")
+        private HelloMBean helloMBean;
+
+        public String greet(String name) {
+            return helloMBean.greet(name);
+        }
+
+        public void setCount(int count) {
+            helloMBean.setCount(count);
+        }
+
+        public void increment() {
+            helloMBean.increment();
+        }
+
+        public int getCount() {
+            return helloMBean.getCount();
+        }
+    }
+}
+----
+
+O atributo name `<name>/<resource-id>`é usado na anotação `@Resource` para executar a injeção. Nenhuma configuração adicional é necessária para injetar o recurso.
+
+== Propriedades adicionais
+
+Além das propriedades `code` e `name` que o código acima usa para instanciar o recurso, o próprio TomEE fornece algumas propriedades para fornecer mais controle sobre a criação de recursos.
+
+Os recursos são normalmente descobertos, criados e vinculados ao
+JNDI muito cedo no processo de implementação, pois outros componentes dependem deles. Isso pode levar a problemas nos quais o classpath final da aplicação ainda não foi determinado e, portanto, o TomEE não pode carregar seu recurso personalizado.
+
+As seguintes propriedades podem ser usadas para alterar esse comportamento.
+
+* Lazy
+
+é um valor booleano que, quando verdadeiro, cria um proxy que adia
+a instanciação real do recurso até a primeira vez que ele olhou para cima do JNDI. 
+Isso pode ser útil se o recurso exigir o classpath da aplicação ou para melhorar o tempo de inicialização não totalmente inicializando recursos que podem não ser usados.
+
+* UseAppClassLoader
+
+Esse valor booleano força um recurso instanciado Lazy a usar o
+classloaders da aplicação, em vez do classloader disponível quando o
+os recursos foram processados primeiro.
+
+* InitializeAfterDeployment
+
+Essa configuração booleana força um recurso criado com a propriedade Lazy a ser instanciado depois que a aplicação é iniciado, em vez de esperar que ele seja procurado. Use esse sinalizador se precisar que o recurso seja carregado,independentemente de ser injetado em um componente gerenciado ou consultado manualmente.
+
+Por padrão, todas essas configurações são `false`, a menos que o TomEE encontre um recurso da aplicação personalizado que não possa ser instanciado até que a aplicação seja iniciada. 
+Nesse caso, ele definirá esses três sinalizadores para `true`, a menos que o sinalizador `Lazy` tenha sido definido explicitamente.
+
+== PostConstruct / PreDestroy
+
+Como alternativa ao uso de um método de fábrica, você pode usar `@PostConstruct`
+e `@PreDestroy` dentro da sua classe de recurso (observe que você não pode
+usar isso dentro de uma classe de fábrica) para gerenciar qualquer criação ou
+atividades de limpeza. O TomEE chama automaticamente esses métodos quando o
+aplicativo é iniciado e destruído. O uso do `@PostConstruct`
+efetivamente forçar um recurso carregado lentamente a ser instanciado quando o
+aplicativo está sendo iniciado - da mesma maneira que o a propriedade `InitializeAfterDeployment` faz.

Review comment:
       ```suggestion
   aplicativo está sendo iniciado - da mesma maneira que a propriedade `InitializeAfterDeployment` faz.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.
+
+== Usando o @Resource para injeção
+
+O caso de teste para este exemplo demonstra a injeção em um EJB como uma maneira de acessar o recurso e também acessar o recurso via JMX.
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class JMXTest {
+
+    @EJB
+    private TestEjb ejb;
+
+    @Deployment
+    public static EnterpriseArchive createDeployment() {
+
+        final JavaArchive ejbJar = new Mvn.Builder()
+                .name("jmx-ejb.jar")
+                .build(JavaArchive.class)
+                .addClass(JMXTest.class)
+                .addClass(TestEjb.class);
+
+        final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
+                .addAsModule(ejbJar);
+
+        return ear;
+    }
+
+    @Test
+    public void test() throws Exception {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
+
+        Assert.assertNotNull(ejb);
+    
+        Assert.assertEquals(0, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(0, ejb.getCount());
+    
+        mbs.invoke(objectName, "increment", new Object[0], new String[0]);
+        Assert.assertEquals(1, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(1, ejb.getCount());
+    
+        ejb.increment();
+        Assert.assertEquals(2, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(2, ejb.getCount());
+
+        Attribute attribute = new Attribute("Count", 12345);
+        mbs.setAttribute(objectName, attribute);
+        Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(12345, ejb.getCount());
+    
+        ejb.setCount(23456);
+        Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(23456, ejb.getCount());
+
+        Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[] { "world" }, new String[] { String.class.getName() }));
+        Assert.assertEquals("Hello, world", ejb.greet("world"));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    public static class TestEjb {
+
+        @Resource(name="jmx/Hello")
+        private HelloMBean helloMBean;
+
+        public String greet(String name) {
+            return helloMBean.greet(name);
+        }
+
+        public void setCount(int count) {
+            helloMBean.setCount(count);
+        }
+
+        public void increment() {
+            helloMBean.increment();
+        }
+
+        public int getCount() {
+            return helloMBean.getCount();
+        }
+    }
+}
+----
+
+O atributo name `<name>/<resource-id>`é usado na anotação `@Resource` para executar a injeção. Nenhuma configuração adicional é necessária para injetar o recurso.
+
+== Propriedades adicionais
+
+Além das propriedades `code` e `name` que o código acima usa para instanciar o recurso, o próprio TomEE fornece algumas propriedades para fornecer mais controle sobre a criação de recursos.
+
+Os recursos são normalmente descobertos, criados e vinculados ao
+JNDI muito cedo no processo de implementação, pois outros componentes dependem deles. Isso pode levar a problemas nos quais o classpath final da aplicação ainda não foi determinado e, portanto, o TomEE não pode carregar seu recurso personalizado.
+
+As seguintes propriedades podem ser usadas para alterar esse comportamento.
+
+* Lazy
+
+é um valor booleano que, quando verdadeiro, cria um proxy que adia
+a instanciação real do recurso até a primeira vez que ele olhou para cima do JNDI. 
+Isso pode ser útil se o recurso exigir o classpath da aplicação ou para melhorar o tempo de inicialização não totalmente inicializando recursos que podem não ser usados.
+
+* UseAppClassLoader
+
+Esse valor booleano força um recurso instanciado Lazy a usar o
+classloaders da aplicação, em vez do classloader disponível quando o
+os recursos foram processados primeiro.
+
+* InitializeAfterDeployment
+
+Essa configuração booleana força um recurso criado com a propriedade Lazy a ser instanciado depois que a aplicação é iniciado, em vez de esperar que ele seja procurado. Use esse sinalizador se precisar que o recurso seja carregado,independentemente de ser injetado em um componente gerenciado ou consultado manualmente.
+
+Por padrão, todas essas configurações são `false`, a menos que o TomEE encontre um recurso da aplicação personalizado que não possa ser instanciado até que a aplicação seja iniciada. 
+Nesse caso, ele definirá esses três sinalizadores para `true`, a menos que o sinalizador `Lazy` tenha sido definido explicitamente.
+
+== PostConstruct / PreDestroy
+
+Como alternativa ao uso de um método de fábrica, você pode usar `@PostConstruct`
+e `@PreDestroy` dentro da sua classe de recurso (observe que você não pode
+usar isso dentro de uma classe de fábrica) para gerenciar qualquer criação ou
+atividades de limpeza. O TomEE chama automaticamente esses métodos quando o
+aplicativo é iniciado e destruído. O uso do `@PostConstruct`
+efetivamente forçar um recurso carregado lentamente a ser instanciado quando o
+aplicativo está sendo iniciado - da mesma maneira que o a propriedade `InitializeAfterDeployment` faz.
+
+[source,java]
+----
+public class Alternative implements AlternativeMBean {
+
+    private static Logger LOGGER = Logger.getLogger(Alternative.class.getName());
+    private Properties properties;
+
+    @PostConstruct
+    public void postConstruct() throws MBeanRegistrationException {
+        // initialize the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(this, objectName);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    @PreDestroy
+    public void preDestroy() throws MBeanRegistrationException {
+        final String name = properties.getProperty("name");
+        requireNotNull(name);
+
+        try {
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.unregisterMBean(objectName);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error unregistering " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (InstanceNotFoundException e) {
+            LOGGER.severe("Error unregistering " + name);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+
+    private int count = 0;
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count;
+    }
+
+    @Override
+    public void setCount(int value) {
+        count = value;
+    }
+
+    @Override
+    public void increment() {
+        count++;
+    }
+}
+----
+
+== Executando
+
+A execução do exemplo pode ser feita no maven com um simples comando `mvn clean install`, executado no diretório `resources-jmx-example`.
+
+Ao executar, você verá uma saída semelhante à seguinte.
+
+[source,console]
+----
+-------------------------------------------------------
+ T E S T E S
+-------------------------------------------------------
+Running org.superbiz.resource.jmx.JMXTest
+Apr 15, 2015 12:40:09 PM org.jboss.arquillian.container.impl.MapObject populate
+WARNING: Configuration contain properties not supported by the backing object org.apache.tomee.arquillian.remote.RemoteTomEEConfiguration
+Unused property entries: {openejbVersion=${tomee.version}, tomcatVersion=}
+Supported property names: [additionalLibs, httpPort, httpsPort, stopCommand, portRange, conf, debug, exportConfAsSystemProperty, type, unpackWars, version, serverXml, preloadClasses, dir, deployerProperties, stopPort, singleDumpByArchiveName, appWorkingDir, host, cleanOnStartUp, quickSession, ajpPort, artifactId, properties, singleDeploymentByArchiveName, groupId, stopHost, lib, catalina_opts, debugPort, webContextToUseWithEars, simpleLog, removeUnusedWebapps, keepServerXmlAsThis, classifier, bin]
+Apr 15, 2015 12:40:09 PM org.apache.openejb.arquillian.common.Setup findHome
+INFO: Unable to find home in: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote
+Apr 15, 2015 12:40:09 PM org.apache.openejb.arquillian.common.MavenCache getArtifact
+INFO: Downloading org.apache.openejb:apache-tomee:7.0.0-SNAPSHOT:zip:plus please wait...
+Apr 15, 2015 12:40:10 PM org.apache.openejb.arquillian.common.Zips unzip
+INFO: Extracting '/Users/jgallimore/.m2/repository/org/apache/openejb/apache-tomee/7.0.0-SNAPSHOT/apache-tomee-7.0.0-SNAPSHOT-plus.zip' to '/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote'
+Apr 15, 2015 12:40:12 PM org.apache.tomee.arquillian.remote.RemoteTomEEContainer configure
+INFO: Downloaded container to: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Started server process on port: 61309
+objc[20102]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Server version:        Apache Tomcat (TomEE)/7.0.61 (7.0.0-SNAPSHOT)
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Server built:          Mar 27 2015 12:03:56 UTC
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Server number:         7.0.61.0
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: OS Name:               Mac OS X
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: OS Version:            10.9.5
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Architecture:          x86_64
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Java Home:             /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/jre
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: JVM Version:           1.7.0_71-b14
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: JVM Vendor:            Oracle Corporation
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: CATALINA_BASE:         /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: CATALINA_HOME:         /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -XX:+HeapDumpOnOutOfMemoryError
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -XX:PermSize=64m
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -XX:MaxPermSize=256m
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Xmx512m
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Xms256m
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -XX:ReservedCodeCacheSize=64m
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dtomee.httpPort=61309
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dorg.apache.openejb.servlet.filters=org.apache.openejb.arquillian.common.ArquillianFilterRunner=/ArquillianServletRunner
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Djava.util.logging.config.file=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/conf/logging.properties
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -javaagent:/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/lib/openejb-javaagent.jar
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Djava.io.tmpdir=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/temp
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Djava.endorsed.dirs=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/endorsed
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dcatalina.base=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dcatalina.home=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dcatalina.ext.dirs=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/lib
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true
+Apr 15, 2015 12:40:14 PM org.apache.catalina.startup.VersionLoggerListener log
+INFO: Command line argument: -ea
+Apr 15, 2015 12:40:14 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
+INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /Users/jgallimore/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
+Apr 15, 2015 12:40:14 PM org.apache.coyote.AbstractProtocol init
+INFO: Initializing ProtocolHandler ["http-bio-61309"]
+Apr 15, 2015 12:40:14 PM org.apache.coyote.AbstractProtocol init
+INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
+Apr 15, 2015 12:40:16 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.jdbc.datasource-creator=org.apache.tomee.jdbc.TomEEDataSourceCreator'
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: ********************************************************************************
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: OpenEJB http://tomee.apache.org/
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: Startup: Wed Apr 15 12:40:16 BST 2015
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: Copyright 1999-2013 (C) Apache OpenEJB Project, All Rights Reserved.
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: Version: 7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: Build date: 20150415
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: Build time: 11:37
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: ********************************************************************************
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: openejb.home = /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:16 PM org.apache.openejb.OpenEJB$Instance <init>
+INFO: openejb.base = /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT
+Apr 15, 2015 12:40:16 PM org.apache.openejb.cdi.CdiBuilder initializeOWB
+INFO: Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@4a00b74b
+Apr 15, 2015 12:40:16 PM org.apache.openejb.cdi.CdiBuilder initializeOWB
+INFO: Succeeded in installing singleton service
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.ConfigurationFactory init
+INFO: openejb configuration file is '/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/conf/tomee.xml'
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.ConfigurationFactory configureService
+INFO: Configuring Service(id=Tomcat Security Service, type=SecurityService, provider-id=Tomcat Security Service)
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.ConfigurationFactory configureService
+INFO: Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
+Apr 15, 2015 12:40:17 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.system.apps=true'
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.ConfigurationFactory configureApplication
+INFO: Configuring enterprise application: openejb
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.InitEjbDeployments deploy
+INFO: Using openejb.deploymentId.format '{ejbName}'
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.InitEjbDeployments deploy
+INFO: Auto-deploying ejb openejb/Deployer: EjbDeployment(deployment-id=openejb/Deployer)
+Apr 15, 2015 12:40:17 PM org.apache.openejb.config.InitEjbDeployments deploy
+INFO: Auto-deploying ejb openejb/ConfigurationInfo: EjbDeployment(deployment-id=openejb/ConfigurationInfo)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.config.InitEjbDeployments deploy
+INFO: Auto-deploying ejb MEJB: EjbDeployment(deployment-id=MEJB)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.config.ConfigurationFactory configureService
+INFO: Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.config.AutoConfig createContainer
+INFO: Auto-creating a container for bean openejb/Deployer: Container(type=STATELESS, id=Default Stateless Container)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.config.AppInfoBuilder build
+INFO: Enterprise application "openejb" loaded.
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating TransactionManager(id=Default Transaction Manager)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating SecurityService(id=Tomcat Security Service)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating Container(id=Default Stateless Container)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.Assembler createAppClassLoader
+INFO: Not creating another application classloader for openejb
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.Assembler createApplication
+INFO: Assembling app: openejb
+Apr 15, 2015 12:40:18 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.jndiname.format={deploymentId}{interfaceType.openejbLegacyName}'
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=openejb/DeployerBusinessRemote) --> Ejb(deployment-id=openejb/Deployer)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/openejb/openejb/Deployer!org.apache.openejb.assembler.Deployer) --> Ejb(deployment-id=openejb/Deployer)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/openejb/openejb/Deployer) --> Ejb(deployment-id=openejb/Deployer)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=openejb/ConfigurationInfoBusinessRemote) --> Ejb(deployment-id=openejb/ConfigurationInfo)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/openejb/openejb/ConfigurationInfo!org.apache.openejb.assembler.classic.cmd.ConfigurationInfo) --> Ejb(deployment-id=openejb/ConfigurationInfo)
+Apr 15, 2015 12:40:18 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/openejb/openejb/ConfigurationInfo) --> Ejb(deployment-id=openejb/ConfigurationInfo)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=MEJB) --> Ejb(deployment-id=MEJB)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/openejb/MEJB!javax.management.j2ee.ManagementHome) --> Ejb(deployment-id=MEJB)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/openejb/MEJB) --> Ejb(deployment-id=MEJB)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Created Ejb(deployment-id=openejb/Deployer, ejb-name=openejb/Deployer, container=Default Stateless Container)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Created Ejb(deployment-id=MEJB, ejb-name=MEJB, container=Default Stateless Container)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Created Ejb(deployment-id=openejb/ConfigurationInfo, ejb-name=openejb/ConfigurationInfo, container=Default Stateless Container)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Started Ejb(deployment-id=openejb/Deployer, ejb-name=openejb/Deployer, container=Default Stateless Container)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Started Ejb(deployment-id=MEJB, ejb-name=MEJB, container=Default Stateless Container)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Started Ejb(deployment-id=openejb/ConfigurationInfo, ejb-name=openejb/ConfigurationInfo, container=Default Stateless Container)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler deployMBean
+INFO: Deployed MBean(openejb.user.mbeans:application=openejb,group=org.apache.openejb.assembler.monitoring,name=JMXDeployer)
+Apr 15, 2015 12:40:19 PM org.apache.openejb.assembler.classic.Assembler createApplication
+INFO: Deployed Application(path=openejb)
+Apr 15, 2015 12:40:20 PM org.apache.openejb.server.ServiceManager initServer
+INFO: Creating ServerService(id=cxf)
+Apr 15, 2015 12:40:20 PM org.apache.openejb.server.ServiceManager initServer
+INFO: Creating ServerService(id=cxf-rs)
+Apr 15, 2015 12:40:20 PM org.apache.openejb.server.SimpleServiceManager start
+INFO:   ** Bound Services **
+Apr 15, 2015 12:40:20 PM org.apache.openejb.server.SimpleServiceManager printRow
+INFO:   NAME                 IP              PORT  
+Apr 15, 2015 12:40:20 PM org.apache.openejb.server.SimpleServiceManager start
+INFO: -------
+Apr 15, 2015 12:40:20 PM org.apache.openejb.server.SimpleServiceManager start
+INFO: Ready!
+Apr 15, 2015 12:40:20 PM org.apache.catalina.startup.Catalina load
+INFO: Initialization processed in 7621 ms
+Apr 15, 2015 12:40:20 PM org.apache.tomee.catalina.OpenEJBNamingContextListener bindResource
+INFO: Importing a Tomcat Resource with id 'UserDatabase' of type 'org.apache.catalina.UserDatabase'.
+Apr 15, 2015 12:40:20 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating Resource(id=UserDatabase)
+Apr 15, 2015 12:40:20 PM org.apache.catalina.core.StandardService startInternal
+INFO: Starting service Catalina
+Apr 15, 2015 12:40:20 PM org.apache.catalina.core.StandardEngine startInternal
+INFO: Starting Servlet Engine: Apache Tomcat (TomEE)/7.0.61 (7.0.0-SNAPSHOT)
+Apr 15, 2015 12:40:21 PM org.apache.coyote.AbstractProtocol start
+INFO: Starting ProtocolHandler ["http-bio-61309"]
+Apr 15, 2015 12:40:21 PM org.apache.coyote.AbstractProtocol start
+INFO: Starting ProtocolHandler ["ajp-bio-8009"]
+Apr 15, 2015 12:40:21 PM org.apache.catalina.startup.Catalina start
+INFO: Server startup in 247 ms
+Apr 15, 2015 12:40:21 PM org.apache.openejb.client.EventLogger log
+INFO: RemoteInitialContextCreated{providerUri=http://localhost:61309/tomee/ejb}
+Apr 15, 2015 12:40:21 PM org.apache.openejb.util.JarExtractor extract
+INFO: Extracting jar: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx.ear
+Apr 15, 2015 12:40:21 PM org.apache.openejb.util.JarExtractor extract
+INFO: Extracted path: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx
+Apr 15, 2015 12:40:21 PM org.apache.openejb.util.JarExtractor extract
+INFO: Extracting jar: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx/arquillian-protocol.war
+Apr 15, 2015 12:40:21 PM org.apache.openejb.util.JarExtractor extract
+INFO: Extracted path: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx/arquillian-protocol
+Apr 15, 2015 12:40:21 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.deployments.classpath.filter.systemapps=false'
+Apr 15, 2015 12:40:23 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.default.deployment-module=org.apache.openejb.config.WebModule'
+Apr 15, 2015 12:40:23 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.default.deployment-module=org.apache.openejb.config.WebModule'
+Apr 15, 2015 12:40:23 PM org.apache.openejb.config.DeploymentsResolver processUrls
+INFO: Found EjbModule in classpath: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx/jmx-ejb.jar
+Apr 15, 2015 12:40:23 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.default.deployment-module=org.apache.openejb.config.WebModule'
+Apr 15, 2015 12:40:23 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.default.deployment-module=org.apache.openejb.config.WebModule'
+Apr 15, 2015 12:40:23 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.default.deployment-module=org.apache.openejb.config.WebModule'
+Apr 15, 2015 12:40:23 PM org.apache.openejb.config.DeploymentsResolver loadFromClasspath
+INFO: Searched 6 classpath urls in 1605 milliseconds.  Average 267 milliseconds per url.
+Apr 15, 2015 12:40:23 PM org.apache.openejb.config.ConfigurationFactory configureApplication
+INFO: Configuring enterprise application: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.InitEjbDeployments deploy
+INFO: Auto-deploying ejb TestEjb: EjbDeployment(deployment-id=TestEjb)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.ConfigurationFactory configureService
+INFO: Configuring Service(id=jmx/Hello, type=Resource, provider-id=jmx/Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.ConfigurationFactory configureService
+INFO: Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig createContainer
+INFO: Auto-creating a container for bean jmx-ejb.Comp1256115069: Container(type=MANAGED, id=Default Managed Container)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating Container(id=Default Managed Container)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.core.managed.SimplePassivater init
+INFO: Using directory /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/apache-tomee-remote/apache-tomee-plus-7.0.0-SNAPSHOT/temp for stateful session passivation
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'java:comp/env/jmx/Hello' in bean jmx-ejb.Comp1256115069 to Resource(id=jmx/Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'openejb/Resource/jmx/Hello' in bean jmx-ejb.Comp1256115069 to Resource(id=Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'openejb/Resource/Hello' in bean jmx-ejb.Comp1256115069 to Resource(id=Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.ConfigurationFactory configureService
+INFO: Configuring Service(id=Default Singleton Container, type=Container, provider-id=Default Singleton Container)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig createContainer
+INFO: Auto-creating a container for bean TestEjb: Container(type=SINGLETON, id=Default Singleton Container)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating Container(id=Default Singleton Container)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'java:comp/env/jmx/Hello' in bean TestEjb to Resource(id=jmx/Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'openejb/Resource/jmx/Hello' in bean TestEjb to Resource(id=Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'openejb/Resource/Hello' in bean TestEjb to Resource(id=Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'openejb/Resource/jmx/Hello' in bean jmx_org.superbiz.resource.jmx.JMXTest to Resource(id=Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AutoConfig processResourceRef
+INFO: Auto-linking resource-ref 'openejb/Resource/Hello' in bean jmx_org.superbiz.resource.jmx.JMXTest to Resource(id=Hello)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.config.AppInfoBuilder build
+INFO: Enterprise application "/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx" loaded.
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.Assembler createAppClassLoader
+INFO: Creating dedicated application classloader for jmx
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.Assembler createApplication
+INFO: Assembling app: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=TestEjbLocalBean) --> Ejb(deployment-id=TestEjb)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/jmx/jmx-ejb/TestEjb!org.superbiz.resource.jmx.JMXTest$TestEjb) --> Ejb(deployment-id=TestEjb)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.assembler.classic.JndiBuilder bind
+INFO: Jndi(name=global/jmx/jmx-ejb/TestEjb) --> Ejb(deployment-id=TestEjb)
+Apr 15, 2015 12:40:24 PM org.apache.openejb.cdi.CdiBuilder initSingleton
+INFO: Existing thread singleton service in SystemInstance(): org.apache.openejb.cdi.ThreadSingletonServiceImpl@4a00b74b
+Apr 15, 2015 12:40:24 PM org.apache.openejb.cdi.OpenEJBLifecycle startApplication
+INFO: OpenWebBeans Container is starting...
+Apr 15, 2015 12:40:24 PM org.apache.webbeans.plugins.PluginLoader startUp
+INFO: Adding OpenWebBeansPlugin : [CdiPlugin]
+Apr 15, 2015 12:40:24 PM org.apache.webbeans.plugins.PluginLoader startUp
+Apr 15, 2015 12:40:25 PM org.apache.webbeans.config.BeansDeployer validateInjectionPoints
+INFO: All injection points were validated successfully.
+Apr 15, 2015 12:40:25 PM org.apache.openejb.cdi.OpenEJBLifecycle startApplication
+INFO: OpenWebBeans Container has started, it took 186 ms.
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Created Ejb(deployment-id=TestEjb, ejb-name=TestEjb, container=Default Singleton Container)
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler startEjbs
+INFO: Started Ejb(deployment-id=TestEjb, ejb-name=TestEjb, container=Default Singleton Container)
+Apr 15, 2015 12:40:25 PM org.apache.tomee.catalina.TomcatWebAppBuilder deployWebApps
+INFO: using default host: localhost
+Apr 15, 2015 12:40:25 PM org.apache.tomee.catalina.TomcatWebAppBuilder init
+INFO: ------------------------- localhost -> /arquillian-protocol
+Apr 15, 2015 12:40:25 PM org.apache.openejb.util.OptionsLog info
+INFO: Using 'openejb.session.manager=org.apache.tomee.catalina.session.QuickSessionManager'
+Apr 15, 2015 12:40:25 PM org.apache.openejb.cdi.CdiBuilder initSingleton
+INFO: Existing thread singleton service in SystemInstance(): org.apache.openejb.cdi.ThreadSingletonServiceImpl@4a00b74b
+Apr 15, 2015 12:40:25 PM org.apache.openejb.cdi.OpenEJBLifecycle startApplication
+INFO: OpenWebBeans Container is starting...
+Apr 15, 2015 12:40:25 PM org.apache.webbeans.plugins.PluginLoader startUp
+INFO: Adding OpenWebBeansPlugin : [CdiPlugin]
+Apr 15, 2015 12:40:25 PM org.apache.webbeans.plugins.PluginLoader startUp
+Apr 15, 2015 12:40:25 PM org.apache.webbeans.config.BeansDeployer validateInjectionPoints
+INFO: All injection points were validated successfully.
+Apr 15, 2015 12:40:25 PM org.apache.openejb.cdi.OpenEJBLifecycle startApplication
+INFO: OpenWebBeans Container has started, it took 17 ms.
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler createRecipe
+INFO: Creating Resource(id=jmx/Hello, aliases=Hello)
+Apr 15, 2015 12:40:25 PM org.superbiz.resource.jmx.factory.JMXBeanCreator create
+INFO: Unable to set value 12345 on field count
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler logUnusedProperties
+WARNING: Property "code" not supported by "jmx/Hello"
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler logUnusedProperties
+WARNING: Property "name" not supported by "jmx/Hello"
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler logUnusedProperties
+WARNING: Property "count" not supported by "jmx/Hello"
+Apr 15, 2015 12:40:25 PM org.apache.openejb.assembler.classic.Assembler createApplication
+INFO: Deployed Application(path=/Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx)
+Apr 15, 2015 12:40:26 PM org.apache.openejb.client.EventLogger log
+INFO: RemoteInitialContextCreated{providerUri=http://localhost:61309/tomee/ejb}
+Apr 15, 2015 12:40:26 PM org.apache.openejb.assembler.classic.Assembler destroyApplication
+INFO: Undeploying app: /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx
+Apr 15, 2015 12:40:27 PM org.apache.openejb.arquillian.common.TomEEContainer undeploy
+INFO: cleaning /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx.ear
+Apr 15, 2015 12:40:27 PM org.apache.openejb.arquillian.common.TomEEContainer undeploy
+INFO: cleaning /Users/jgallimore/tmp/tomee-1.7.x/examples/resources-jmx-example/resources-jmx-ejb/target/arquillian-test-working-dir/0/jmx
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18.464 sec
+Apr 15, 2015 12:40:27 PM org.apache.catalina.core.StandardServer await
+INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
+Apr 15, 2015 12:40:27 PM org.apache.coyote.AbstractProtocol pause
+INFO: Pausing ProtocolHandler ["http-bio-61309"]
+Apr 15, 2015 12:40:27 PM org.apache.coyote.AbstractProtocol pause
+INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
+Apr 15, 2015 12:40:27 PM org.apache.catalina.core.StandardService stopInternal
+INFO: Stopping service Catalina
+Apr 15, 2015 12:40:27 PM org.apache.coyote.AbstractProtocol stop
+INFO: Stopping ProtocolHandler ["http-bio-61309"]
+Apr 15, 2015 12:40:27 PM org.apache.coyote.AbstractProtocol stop
+INFO: Stopping ProtocolHandler ["ajp-bio-8009"]
+Apr 15, 2015 12:40:27 PM org.apache.openejb.server.SimpleServiceManager stop
+INFO: Stopping server services
+Apr 15, 2015 12:40:27 PM org.apache.openejb.assembler.classic.Assembler destroyApplication
+INFO: Undeploying app: openejb
+Apr 15, 2015 12:40:27 PM org.apache.coyote.AbstractProtocol destroy
+INFO: Destroying ProtocolHandler ["http-bio-61309"]
+Apr 15, 2015 12:40:27 PM org.apache.coyote.AbstractProtocol destroy
+INFO: Destroying ProtocolHandler ["ajp-bio-8009"]
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+----
+
+NOTE:as seguintes linhas mostrando a criação do recurso.

Review comment:
       ```suggestion
   NOTE: as seguintes linhas mostrando a criação do recurso.
   ```

##########
File path: examples/resources-jmx-example/README_pt.adoc
##########
@@ -0,0 +1,772 @@
+:index-group: JMX
+:jbake-type: page
+:jbake-status: status=published
+= Custom resources in an EAR archive
+
+O TomEE permite que você defina seus próprios recursos na sua aplicação e declare-os em `META-INF/resources.xml`. Isso permite que você injete esses recursos em qualquer componente gerenciado na sua aplicação.
+
+Além disso, você também pode definir um método `create` no próprio recurso ou em um POJO que atua como uma fábrica.
+Este exemplo demonstra o uso do método `create` para registrar adicionalmente o recurso como um JMX MBean, além de disponibilizá-lo para injeção.
+
+== Resource
+
+Recursos customizados podem ser definidos usando classes Java muito simples. Nesse caso específico, como o aplicativo também deseja registrar esse como MBean, a classe de recurso precisa seguir o MBean especificação.
+
+[source,java]
+----
+public class Hello implements HelloMBean {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public String greet(String name) {
+        if (name == null) {
+            throw new NullPointerException("Name cannot be null");
+        }
+
+        return "Hello, " + name;
+    }
+
+    @Override
+    public int getCount() {
+        return count.get();
+    }
+
+    @Override
+    public void setCount(int value) {
+        count.set(value);
+    }
+
+    @Override
+    public void increment() {
+        count.incrementAndGet();
+    }
+}
+
+public interface HelloMBean {
+
+    public String greet(final String name);
+
+    public int getCount();
+
+    public void setCount(int count);
+
+    public void increment();
+
+}
+----
+
+== Método Criar(Create)
+
+To avoid adding the logic to register the resource as an MBean in every
+resource, the application provides a single class with a create() method
+that takes care of this logic for us.
+
+Para evitar adicionar a lógica para registrar o recurso como um MBean em todos os recursos, a aplicação fornece a uma única classe um método `create()` que cuida dessa lógica para nós.
+
+[source,java]
+----
+public class JMXBeanCreator {
+
+    private static Logger LOGGER = Logger.getLogger(JMXBeanCreator.class.getName());
+    private Properties properties;
+
+    public Object create() throws MBeanRegistrationException {
+        // instantiate the bean
+
+        final String code = properties.getProperty("code");
+        final String name = properties.getProperty("name");
+
+        requireNotNull(code);
+        requireNotNull(name);
+
+        try {
+            final Class<?> cls = Class.forName(code, true, Thread.currentThread().getContextClassLoader());
+            final Object instance = cls.newInstance();
+
+            final Field[] fields = cls.getDeclaredFields();
+            for (final Field field : fields) {
+
+                final String property = properties.getProperty(field.getName());
+                if (property == null) {
+                    continue;
+                }
+
+                try {
+                    field.setAccessible(true);
+                    field.set(instance, Converter.convert(property, field.getType(), field.getName()));
+                } catch (Exception e) {
+                    LOGGER.info(String.format("Unable to set value %s on field %s", property, field.getName()));
+                }
+            }
+
+            final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            final ObjectName objectName = new ObjectName(name);
+            mbs.registerMBean(instance, objectName);
+
+            return instance;
+
+        } catch (final ClassNotFoundException e) {
+            LOGGER.severe("Unable to find class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstantiationException e) {
+            LOGGER.severe("Unable to create instance of class " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final IllegalAccessException e) {
+            LOGGER.severe("Illegal access: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final MalformedObjectNameException e) {
+            LOGGER.severe("Malformed MBean name: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final InstanceAlreadyExistsException e) {
+            LOGGER.severe("Instance already exists: " + name);
+            throw new MBeanRegistrationException(e);
+        } catch (final NotCompliantMBeanException e) {
+            LOGGER.severe("Class is not a valid MBean: " + code);
+            throw new MBeanRegistrationException(e);
+        } catch (final javax.management.MBeanRegistrationException e) {
+            LOGGER.severe("Error registering " + name + ", " + code);
+            throw new MBeanRegistrationException(e);
+        }
+    }
+
+    private void requireNotNull(final String object) throws MBeanRegistrationException {
+        if (object == null) {
+            throw new MBeanRegistrationException("code property not specified, stopping");
+        }
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(final Properties properties) {
+        this.properties = properties;
+    }
+}
+----
+
+NOTE: que esta classe usa as propriedades definidas na configuração
+(abaixo), combinada com reflexão, para instanciar o recurso e definir
+seus atributos. O código acima requer duas propriedades `code` e `name`
+para saber qual classe criar e o nome JMX para registrá-la
+debaixo.
+
+== Resource
+
+O recurso pode ser definido em `META-INF/resources.xml` da seguinte maneira:
+
+[source,xml]
+----
+<Resources>
+  <Resource id="Hello" class-name="org.superbiz.resource.jmx.factory.JMXBeanCreator" factory-name="create">
+    code org.superbiz.resource.jmx.resources.Hello
+    name superbiz.test:name=Hello
+    count 12345
+  </Resource>
+</Resources>
+----
+
+NOTE: que o atributo class-name se refere à classe factory, e não
+o recurso. Depois que o recurso for criado e vinculado ao TomEE,
+Árvore JNDI da fábrica não é mais usada.
+
+== Usando o @Resource para injeção
+
+O caso de teste para este exemplo demonstra a injeção em um EJB como uma maneira de acessar o recurso e também acessar o recurso via JMX.
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class JMXTest {
+
+    @EJB
+    private TestEjb ejb;
+
+    @Deployment
+    public static EnterpriseArchive createDeployment() {
+
+        final JavaArchive ejbJar = new Mvn.Builder()
+                .name("jmx-ejb.jar")
+                .build(JavaArchive.class)
+                .addClass(JMXTest.class)
+                .addClass(TestEjb.class);
+
+        final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, "jmx.ear")
+                .addAsModule(ejbJar);
+
+        return ear;
+    }
+
+    @Test
+    public void test() throws Exception {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName("superbiz.test:name=Hello");
+
+        Assert.assertNotNull(ejb);
+    
+        Assert.assertEquals(0, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(0, ejb.getCount());
+    
+        mbs.invoke(objectName, "increment", new Object[0], new String[0]);
+        Assert.assertEquals(1, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(1, ejb.getCount());
+    
+        ejb.increment();
+        Assert.assertEquals(2, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(2, ejb.getCount());
+
+        Attribute attribute = new Attribute("Count", 12345);
+        mbs.setAttribute(objectName, attribute);
+        Assert.assertEquals(12345, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(12345, ejb.getCount());
+    
+        ejb.setCount(23456);
+        Assert.assertEquals(23456, mbs.getAttribute(objectName, "Count"));
+        Assert.assertEquals(23456, ejb.getCount());
+
+        Assert.assertEquals("Hello, world", mbs.invoke(objectName, "greet", new Object[] { "world" }, new String[] { String.class.getName() }));
+        Assert.assertEquals("Hello, world", ejb.greet("world"));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    public static class TestEjb {
+
+        @Resource(name="jmx/Hello")
+        private HelloMBean helloMBean;
+
+        public String greet(String name) {
+            return helloMBean.greet(name);
+        }
+
+        public void setCount(int count) {
+            helloMBean.setCount(count);
+        }
+
+        public void increment() {
+            helloMBean.increment();
+        }
+
+        public int getCount() {
+            return helloMBean.getCount();
+        }
+    }
+}
+----
+
+O atributo name `<name>/<resource-id>`é usado na anotação `@Resource` para executar a injeção. Nenhuma configuração adicional é necessária para injetar o recurso.
+
+== Propriedades adicionais
+
+Além das propriedades `code` e `name` que o código acima usa para instanciar o recurso, o próprio TomEE fornece algumas propriedades para fornecer mais controle sobre a criação de recursos.
+
+Os recursos são normalmente descobertos, criados e vinculados ao
+JNDI muito cedo no processo de implementação, pois outros componentes dependem deles. Isso pode levar a problemas nos quais o classpath final da aplicação ainda não foi determinado e, portanto, o TomEE não pode carregar seu recurso personalizado.
+
+As seguintes propriedades podem ser usadas para alterar esse comportamento.
+
+* Lazy
+
+é um valor booleano que, quando verdadeiro, cria um proxy que adia
+a instanciação real do recurso até a primeira vez que ele olhou para cima do JNDI. 
+Isso pode ser útil se o recurso exigir o classpath da aplicação ou para melhorar o tempo de inicialização não totalmente inicializando recursos que podem não ser usados.
+
+* UseAppClassLoader
+
+Esse valor booleano força um recurso instanciado Lazy a usar o
+classloaders da aplicação, em vez do classloader disponível quando o
+os recursos foram processados primeiro.
+
+* InitializeAfterDeployment
+
+Essa configuração booleana força um recurso criado com a propriedade Lazy a ser instanciado depois que a aplicação é iniciado, em vez de esperar que ele seja procurado. Use esse sinalizador se precisar que o recurso seja carregado,independentemente de ser injetado em um componente gerenciado ou consultado manualmente.
+
+Por padrão, todas essas configurações são `false`, a menos que o TomEE encontre um recurso da aplicação personalizado que não possa ser instanciado até que a aplicação seja iniciada. 
+Nesse caso, ele definirá esses três sinalizadores para `true`, a menos que o sinalizador `Lazy` tenha sido definido explicitamente.
+
+== PostConstruct / PreDestroy
+
+Como alternativa ao uso de um método de fábrica, você pode usar `@PostConstruct`
+e `@PreDestroy` dentro da sua classe de recurso (observe que você não pode
+usar isso dentro de uma classe de fábrica) para gerenciar qualquer criação ou
+atividades de limpeza. O TomEE chama automaticamente esses métodos quando o
+aplicativo é iniciado e destruído. O uso do `@PostConstruct`
+efetivamente forçar um recurso carregado lentamente a ser instanciado quando o

Review comment:
       ```suggestion
   efetivamente força um recurso carregado lentamente a ser instanciado quando o
   ```




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org