You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by jb...@apache.org on 2017/10/18 20:41:47 UTC

[1/2] activemq-artemis git commit: This closes #1593

Repository: activemq-artemis
Updated Branches:
  refs/heads/master b7125d51c -> cf6318783


This closes #1593


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/cf631878
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/cf631878
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/cf631878

Branch: refs/heads/master
Commit: cf6318783833b3b0720aa2ae6db9e39526bd9054
Parents: b7125d5 a64d7c2
Author: Justin Bertram <jb...@apache.org>
Authored: Wed Oct 18 15:24:44 2017 -0500
Committer: Justin Bertram <jb...@apache.org>
Committed: Wed Oct 18 15:24:44 2017 -0500

----------------------------------------------------------------------
 .../core/config/JMXConnectorConfiguration.java  |   6 +-
 .../server/management/JaasAuthenticator.java    |  34 ++--
 docs/user-manual/en/management.md               |  36 +++-
 examples/features/standard/jmx-ssl/pom.xml      | 114 ++++++++++++
 examples/features/standard/jmx-ssl/readme.html  | 176 +++++++++++++++++++
 .../artemis/jms/example/JMXExample.java         | 127 +++++++++++++
 .../activemq/server0/activemq.example.keystore  | Bin 0 -> 1273 bytes
 .../server0/activemq.example.truststore         | Bin 0 -> 866 bytes
 .../main/resources/activemq/server0/broker.xml  |  64 +++++++
 .../resources/activemq/server0/management.xml   |  56 ++++++
 .../jmx-ssl/src/main/resources/jndi.properties  |  20 +++
 examples/features/standard/jmx/pom.xml          |   2 +-
 examples/features/standard/jmx/readme.html      |   3 +-
 .../artemis/jms/example/JMXExample.java         |   1 +
 .../resources/activemq/server0/management.xml   |   2 +-
 .../features/standard/message-counters/pom.xml  |   1 +
 .../jms/example/MessageCounterExample.java      |   1 +
 17 files changed, 614 insertions(+), 29 deletions(-)
----------------------------------------------------------------------



[2/2] activemq-artemis git commit: ARTEMIS-1463 - added SSL example + docs

Posted by jb...@apache.org.
ARTEMIS-1463 - added SSL example + docs

also added support for anon login

https://issues.apache.org/jira/browse/ARTEMIS-1463


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/a64d7c2e
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/a64d7c2e
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/a64d7c2e

Branch: refs/heads/master
Commit: a64d7c2e422d7066dd6a82f2e4fb6ec312d9c752
Parents: b7125d5
Author: Andy Taylor <an...@gmail.com>
Authored: Wed Oct 18 09:58:39 2017 +0100
Committer: Justin Bertram <jb...@apache.org>
Committed: Wed Oct 18 15:24:44 2017 -0500

----------------------------------------------------------------------
 .../core/config/JMXConnectorConfiguration.java  |   6 +-
 .../server/management/JaasAuthenticator.java    |  34 ++--
 docs/user-manual/en/management.md               |  36 +++-
 examples/features/standard/jmx-ssl/pom.xml      | 114 ++++++++++++
 examples/features/standard/jmx-ssl/readme.html  | 176 +++++++++++++++++++
 .../artemis/jms/example/JMXExample.java         | 127 +++++++++++++
 .../activemq/server0/activemq.example.keystore  | Bin 0 -> 1273 bytes
 .../server0/activemq.example.truststore         | Bin 0 -> 866 bytes
 .../main/resources/activemq/server0/broker.xml  |  64 +++++++
 .../resources/activemq/server0/management.xml   |  56 ++++++
 .../jmx-ssl/src/main/resources/jndi.properties  |  20 +++
 examples/features/standard/jmx/pom.xml          |   2 +-
 examples/features/standard/jmx/readme.html      |   3 +-
 .../artemis/jms/example/JMXExample.java         |   1 +
 .../resources/activemq/server0/management.xml   |   2 +-
 .../features/standard/message-counters/pom.xml  |   1 +
 .../jms/example/MessageCounterExample.java      |   1 +
 17 files changed, 614 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/JMXConnectorConfiguration.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/JMXConnectorConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/JMXConnectorConfiguration.java
index 786f554..b47acf5 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/JMXConnectorConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/JMXConnectorConfiguration.java
@@ -16,6 +16,8 @@
  */
 package org.apache.activemq.artemis.core.config;
 
+import java.security.KeyStore;
+
 public class JMXConnectorConfiguration {
    private int rmiRegistryPort;
    private String connectorHost = "localhost";
@@ -27,10 +29,10 @@ public class JMXConnectorConfiguration {
    private String objectName = "connector:name=rmi";
    private String authenticatorType = "password";
    private boolean secured =  false;
-   private String keyStoreProvider;
+   private String keyStoreProvider = KeyStore.getDefaultType();
    private String keyStorePath;
    private String keyStorePassword;
-   private String trustStoreProvider;
+   private String trustStoreProvider = KeyStore.getDefaultType();
    private String trustStorePath;
    private String trustStorePassword;
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/JaasAuthenticator.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/JaasAuthenticator.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/JaasAuthenticator.java
index 23167e9..739392a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/JaasAuthenticator.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/JaasAuthenticator.java
@@ -40,27 +40,29 @@ public class JaasAuthenticator implements JMXAuthenticator {
    }
 
    @Override
-   public Subject authenticate(Object credentials) throws SecurityException {
-      if (!(credentials instanceof String[])) {
-         throw new IllegalArgumentException("Expected String[2], got "
-               + (credentials != null ? credentials.getClass().getName() : null));
-      }
-
-      final String[] params = (String[]) credentials;
-      if (params.length != 2) {
-         throw new IllegalArgumentException("Expected String[2] but length was " + params.length);
-      }
+   public Subject authenticate(final Object credentials) throws SecurityException {
       try {
          Subject subject = new Subject();
-         LoginContext loginContext = new LoginContext(realm, subject, new CallbackHandler() {
 
+         LoginContext loginContext = new LoginContext(realm, subject, new CallbackHandler() {
             @Override
             public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+               /*
+               * pull out the jmx credentials if they exist if not, guest login module will handle it
+               * */
+               String[] params = null;
+               if (credentials instanceof String[] && ((String[]) credentials).length == 2) {
+                  params = (String[]) credentials;
+               }
                for (int i = 0; i < callbacks.length; i++) {
                   if (callbacks[i] instanceof NameCallback) {
-                     ((NameCallback) callbacks[i]).setName(params[0]);
+                     if (params != null) {
+                        ((NameCallback) callbacks[i]).setName(params[0]);
+                     }
                   } else if (callbacks[i] instanceof PasswordCallback) {
-                     ((PasswordCallback) callbacks[i]).setPassword((params[1].toCharArray()));
+                     if (params != null) {
+                        ((PasswordCallback) callbacks[i]).setPassword((params[1].toCharArray()));
+                     }
                   } else {
                      throw new UnsupportedCallbackException(callbacks[i]);
                   }
@@ -68,12 +70,6 @@ public class JaasAuthenticator implements JMXAuthenticator {
             }
          });
          loginContext.login();
-
-          /*  if (subject.getPrincipals().size() == 0) {
-                // there must be some Principals, but which ones required are tested later
-                throw new FailedLoginException("User does not have the required role");
-            }*/
-
          return subject;
       } catch (LoginException e) {
          throw new SecurityException("Authentication failed", e);

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/docs/user-manual/en/management.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/management.md b/docs/user-manual/en/management.md
index 9587d05..34a2f45 100644
--- a/docs/user-manual/en/management.md
+++ b/docs/user-manual/en/management.md
@@ -404,10 +404,38 @@ using the service url `service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi` and
 
 You can also configure the connector using the following:
 
--  connector-host The host to expose the agent on
--  connector-port The port to expose the agent on 
--  jmx-realm The jmx realm to use for authentication, defaults to `activemq` to match the JAAS configuration.
--  object-name The object name to expose the remote connector on, default is `connector:name=rmi`
+-  connector-host 
+   
+   The host to expose the agent on
+-  connector-port 
+   
+   The port to expose the agent on 
+-  jmx-realm 
+   
+   The jmx realm to use for authentication, defaults to `activemq` to match the JAAS configuration.
+-  object-name 
+   
+   The object name to expose the remote connector on, default is `connector:name=rmi`
+-  secured 
+   
+   Whether the connector is secured using SSL
+-  key-store-path 
+   
+   The location of the keystore
+-  key-store-password 
+   
+   The keystore password
+-  key-store-provider 
+   The provider, JKS by default
+-  trust-store-path 
+   
+   The location of the truststore 
+-  trust-store-password 
+   
+   The trustore password
+-  trust-store-provider 
+   
+   The provider, JKS by default
 
 > **Note**
 >

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/pom.xml
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/pom.xml b/examples/features/standard/jmx-ssl/pom.xml
new file mode 100644
index 0000000..04e7be9
--- /dev/null
+++ b/examples/features/standard/jmx-ssl/pom.xml
@@ -0,0 +1,114 @@
+<?xml version='1.0'?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.apache.activemq.examples.broker</groupId>
+      <artifactId>jms-examples</artifactId>
+      <version>2.4.0-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>jmx-ssl</artifactId>
+   <packaging>jar</packaging>
+   <name>ActiveMQ Artemis JMS "JMX over SSL" Example</name>
+
+   <properties>
+      <activemq.basedir>${project.basedir}/../../../..</activemq.basedir>
+   </properties>
+
+   <dependencies>
+      <dependency>
+         <groupId>org.apache.activemq</groupId>
+         <artifactId>artemis-core-client</artifactId>
+         <version>${project.version}</version>
+      </dependency>
+      <dependency>
+         <groupId>org.apache.activemq</groupId>
+         <artifactId>artemis-jms-client</artifactId>
+         <version>${project.version}</version>
+      </dependency>
+   </dependencies>
+
+   <build>
+      <plugins>
+         <plugin>
+            <groupId>org.apache.activemq</groupId>
+            <artifactId>artemis-maven-plugin</artifactId>
+            <executions>
+               <execution>
+                  <id>create</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <ignore>${noServer}</ignore>
+                     <javaOptions>-Djava.rmi.server.hostname=localhost</javaOptions>
+                  </configuration>
+               </execution>
+               <execution>
+                  <id>start</id>
+                  <goals>
+                     <goal>cli</goal>
+                  </goals>
+                  <configuration>
+                     <ignore>${noServer}</ignore>
+                     <spawn>true</spawn>
+                     <testURI>tcp://localhost:61616</testURI>
+                     <args>
+                        <param>run</param>
+                     </args>
+                  </configuration>
+               </execution>
+               <execution>
+                  <id>runClient</id>
+                  <goals>
+                     <goal>runClient</goal>
+                  </goals>
+                  <configuration> 
+                     <clientClass>org.apache.activemq.artemis.jms.example.JMXExample</clientClass>
+                  </configuration>
+               </execution>
+               <execution>
+                  <id>stop</id>
+                  <goals>
+                     <goal>cli</goal>
+                  </goals>
+                  <configuration>
+                     <ignore>${noServer}</ignore>
+                     <args>
+                        <param>stop</param>
+                     </args>
+                  </configuration>
+               </execution>
+            </executions>
+            <dependencies>
+               <dependency>
+                  <groupId>org.apache.activemq.examples.broker</groupId>
+                  <artifactId>jmx</artifactId>
+                  <version>${project.version}</version>
+               </dependency>
+            </dependencies>
+         </plugin>
+      </plugins>
+   </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/readme.html
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/readme.html b/examples/features/standard/jmx-ssl/readme.html
new file mode 100644
index 0000000..ca4e6da
--- /dev/null
+++ b/examples/features/standard/jmx-ssl/readme.html
@@ -0,0 +1,176 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<html>
+  <head>
+    <title>ActiveMQ Artemis JMX SSL Management Example</title>
+    <link rel="stylesheet" type="text/css" href="../../../common/common.css" />
+    <link rel="stylesheet" type="text/css" href="../../../common/prettify.css" />
+    <script type="text/javascript" src="../../../common/prettify.js"></script>
+  </head>
+  <body onload="prettyPrint()">
+     <h1>JMX Management Example</h1>
+
+     <pre>To run the example, simply type <b>mvn verify -Djavax.net.ssl.keyStore=target/server0/etc/activemq.example.keystore -Djavax.net.ssl.keyStorePassword=activemqexample -Djavax.net.ssl.trustStore=target/server0/etc/activemq.example.truststore -Djavax.net.ssl.trustStorePassword=activemqexample</b> from this directory, <br>or add <b>-PnoServer</b> if you want to start and create the server manually.</pre>
+
+     <p>This example shows how to manage ActiveMQ Artemis using <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">JMX using SSL</a></p>
+
+     <h2>Example configuration</h2>
+
+     <p>ActiveMQ Artemis exposes its managed resources by default on the platform MBeanServer.</p>
+     <p>To access this MBeanServer remotely, add the following to the management.xml configuration:
+         <pre class="prettyprint">
+             <code><connector connector-port="1099" connector-host="localhost"/></code>
+        </pre>
+        <p>With these properties, ActiveMQ Artemis server will be manageable remotely using standard JMX URL on port <code>1099</code>.</p>
+     </p>
+
+     <h2>Example step-by-step</h2>
+     <ol>
+        <li>First we need to get an initial context so we can look-up the JMS connection factory and destination objects from JNDI. This initial context will get its properties from <a href="server0/client-jndi.properties">client-jndi.properties</a></li>
+        <pre class="prettyprint">
+            <code>InitialContext initialContext = getContext(0);</code>
+        </pre>
+
+        <li>We look up the JMS queue object from JNDI</li>
+        <pre class="prettyprint">
+            <code>Queue queue = (Queue) initialContext.lookup("/queue/exampleQueue");</code>
+        </pre>
+
+        <li>We look up the JMS connection factory object from JNDI</li>
+        <pre class="prettyprint">
+            <code>ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("/ConnectionFactory");</code>
+        </pre>
+
+        <li>We create a JMS connection</li>
+        <pre class="prettyprint">
+            <code>connection = cf.createConnection();</code>
+        </pre>
+
+        <li>We create a JMS session. The session is created as non transacted and will auto acknowledge messages.</li>
+        <pre class="prettyprint">
+            <code>Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);</code>
+        </pre>
+
+        <li>We create a JMS message producer on the session. This will be used to send the messages.</li>
+        <pre class="prettyprint">
+            <code>MessageProducer messageProducer = session.createProducer(topic);</code>
+       </pre>
+
+        <li>We create a JMS text message that we are going to send.</li>
+        <pre class="prettyprint">
+            <code>TextMessage message = session.createTextMessage("This is a text message");</code>
+        </pre>
+
+        <li>We send message to the queue</li>
+        <pre class="prettyprint">
+            <code>messageProducer.send(message);</code>
+        </pre>
+
+        <p><em>Now that we have a message in the queue, we will manage the queue by retrieving the number of messages in the queue
+            (i.e. 1) and by removing the message which has been sent in step 8.</em></p>
+
+        <li>We retrieve the <code>ObjectName</code> corresponding to the queue using a helper class <code>ObjectNameBuilder</code></li>
+        <pre class="prettyprint">
+              <code>ObjectName on = ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queue.getQueueName());</code>
+        </pre>
+
+        <li>We create a JMX Connector to connect to the server's MBeanServer using the <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html#gdevg">standard JMX service URL</a></li>
+        <pre class="prettyprint">
+            <code>JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(JMX_URL), new HashMap());</code>
+        </pre>
+
+        <li>We retrieve a <code>MBeanServerConnection</code> from the JMX connector</li>
+        <pre class="prettyprint">
+           <code>TextMessage messageReceived = (TextMessage) messageConsumer.receive(5000);</code>
+        </pre>
+
+        <li>We create a <code>JMSQueueControl</code> proxy to manage the queue on the server</li>
+        <pre class="prettyprint">
+            <code>JMSQueueControl queueControl = (JMSQueueControl)MBeanServerInvocationHandler.newProxyInstance(mbsc,
+                                                                                              on,
+                                                                                              JMSQueueControl.class,
+                                                                                              false);
+             </code>
+        </pre>
+
+        <li>We use this mbean proxy to retrieve the number of messages in the queue using the <code>getMessageCount</code> method</li>
+        <pre class="prettyprint">
+            <code>System.out.println(queueControl.getName() + " contains " + queueControl.getMessageCount() + " messages");</code>
+        </pre>
+
+        <li>We will now remove the message sent at step 8 using the <code>removeMessage</code> method with the JMS Message ID of the message</li>
+        <pre class="prettyprint">
+            <code>System.out.println("message has been removed: " + queueControl.removeMessage(message.getJMSMessageID()));</code>
+        </pre>
+
+        <li>We use again the mbean proxy to retrieve the number of messages. This time, it will display <code>0</code> messages</li>
+        <pre class="prettyprint">
+            <code>System.out.println(queueControl.getName() + " contains " + queueControl.getMessageCount() + " messages");</code>
+        </pre>
+
+        <li>Now we have finish the management operations, we close the JMX connector</li>
+        <pre class="prettyprint">
+            <code>connector.close()</code>
+        </pre>
+
+        <p><em>We will now try to consume the message sent to the queue but it won't be there: it has been removed by the management operation</em></p>
+
+        <li>We create a JMS message consumer on the queue</li>
+        <pre class="prettyprint">
+            <code>MessageConsumer messageConsumer = session.createConsumer(queue);</code>
+        </pre>
+
+        <li>We start the connection. In order for delivery to occur on any consumers or subscribers on a connection, the connection must be started</li>
+        <pre class="prettyprint">
+            <code>connection.start();</code>
+        </pre>
+
+        <li>We try to receive a message from the queue. Since there is none, the call will timeout after 5000ms and messageReceived will be null
+        </li>
+        <pre class="prettyprint">
+            <code>TextMessage messageReceived = (TextMessage) messageConsumer.receive(5000);
+            System.out.println("Received message: " + messageReceived);</code>
+        </pre>
+
+        <li>And finally, <b>always</b> remember to close your JMS connections and resources after use, in a <code>finally</code> block. Closing a JMS connection will automatically close all of its sessions, consumers, producer and browser objects</li>
+
+        <pre class="prettyprint">
+           <code>finally
+           {
+              if (initialContext != null)
+              {
+                initialContext.close();
+              }
+              if (connection != null)
+              {
+                 connection.close();
+              }
+           }</code>
+        </pre>
+     </ol>
+
+     <h2>More information</h2>
+
+     <ul>
+        <li>User Manual's <a href="../../../docs/user-manual/en/html_single/index.html#management.jmx">Using Management Via JMX chapter</a></li>
+        <li><a href="http://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html">Java management guide</a></li>
+     </ul>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java b/examples/features/standard/jmx-ssl/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
new file mode 100644
index 0000000..9223a5e
--- /dev/null
+++ b/examples/features/standard/jmx-ssl/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.jms.example;
+
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.QueueSession;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.naming.InitialContext;
+import java.util.HashMap;
+
+import org.apache.activemq.artemis.api.core.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
+import org.apache.activemq.artemis.api.core.management.QueueControl;
+import org.apache.activemq.artemis.jms.client.ActiveMQTextMessage;
+
+/**
+ * An example that shows how to manage ActiveMQ Artemis using JMX.
+ */
+public class JMXExample {
+
+   private static final String JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
+
+   public static void main(final String[] args) throws Exception {
+      QueueConnection connection = null;
+      InitialContext initialContext = null;
+      try {
+         // Step 1. Create an initial context to perform the JNDI lookup.
+         initialContext = new InitialContext();
+
+         // Step 2. Perfom a lookup on the queue
+         Queue queue = (Queue) initialContext.lookup("queue/exampleQueue");
+
+         // Step 3. Perform a lookup on the Connection Factory
+         QueueConnectionFactory cf = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
+
+         // Step 4.Create a JMS Connection
+         connection = cf.createQueueConnection();
+
+         // Step 5. Create a JMS Session
+         QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
+
+         // Step 6. Create a JMS Message Producer
+         MessageProducer producer = session.createProducer(queue);
+
+         // Step 7. Create a Text Message
+         TextMessage message = session.createTextMessage("This is a text message");
+         System.out.println("Sent message: " + message.getText());
+
+         // Step 8. Send the Message
+         producer.send(message);
+
+         // Step 9. Retrieve the ObjectName of the queue. This is used to identify the server resources to manage
+         ObjectName on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(queue.getQueueName()), SimpleString.toSimpleString(queue.getQueueName()), RoutingType.ANYCAST);
+
+         // Step 10. Create JMX Connector to connect to the server's MBeanServer
+         //we dont actually need credentials as the guest login i sused but this is how its done
+         HashMap env = new HashMap();
+         String[] creds = {"guest", "guest"};
+         env.put(JMXConnector.CREDENTIALS, creds);
+
+         JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(JMXExample.JMX_URL), env);
+
+         // Step 11. Retrieve the MBeanServerConnection
+         MBeanServerConnection mbsc = connector.getMBeanServerConnection();
+
+         // Step 12. Create a QueueControl proxy to manage the queue on the server
+         QueueControl queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
+         // Step 13. Display the number of messages in the queue
+         System.out.println(queueControl.getName() + " contains " + queueControl.getMessageCount() + " messages");
+
+         // Step 14. Remove the message sent at step #8
+         System.out.println("message has been removed: " + queueControl.removeMessage(((ActiveMQTextMessage) message).getCoreMessage().getMessageID()));
+
+         // Step 15. Display the number of messages in the queue
+         System.out.println(queueControl.getName() + " contains " + queueControl.getMessageCount() + " messages");
+
+         // Step 16. We close the JMX connector
+         connector.close();
+
+         // Step 17. Create a JMS Message Consumer on the queue
+         MessageConsumer messageConsumer = session.createConsumer(queue);
+
+         // Step 18. Start the Connection
+         connection.start();
+
+         // Step 19. Trying to receive a message. Since the only message in the queue was removed by a management
+         // operation, there is none to consume.
+         // The call will timeout after 5000ms and messageReceived will be null
+         TextMessage messageReceived = (TextMessage) messageConsumer.receive(5000);
+         System.out.println("Received message: " + messageReceived);
+      } finally {
+         // Step 20. Be sure to close the resources!
+         if (initialContext != null) {
+            initialContext.close();
+         }
+         if (connection != null) {
+            connection.close();
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.keystore
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.keystore b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.keystore
new file mode 100644
index 0000000..50de681
Binary files /dev/null and b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.keystore differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.truststore
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.truststore b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.truststore
new file mode 100644
index 0000000..129391a
Binary files /dev/null and b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/activemq.example.truststore differ

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/broker.xml
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/broker.xml b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/broker.xml
new file mode 100644
index 0000000..7576376
--- /dev/null
+++ b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/broker.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
+
+   
+
+   <core xmlns="urn:activemq:core">
+
+      <bindings-directory>./data/messaging/bindings</bindings-directory>
+
+      <journal-directory>./data/messaging/journal</journal-directory>
+
+      <large-messages-directory>./data/messaging/largemessages</large-messages-directory>
+
+      <paging-directory>./data/messaging/paging</paging-directory>
+
+
+      <!-- true to expose ActiveMQ Artemis resources through JMX -->
+      <jmx-management-enabled>true</jmx-management-enabled>
+
+      <!-- Acceptors -->
+      <acceptors>
+         <acceptor name="netty">tcp://localhost:61616</acceptor>
+      </acceptors>
+
+      <!-- Other config -->
+
+      <security-settings>
+         <!--security for example queue-->
+         <security-setting match="exampleQueue">
+            <permission roles="guest" type="createDurableQueue"/>
+            <permission roles="guest" type="deleteDurableQueue"/>
+            <permission roles="guest" type="createNonDurableQueue"/>
+            <permission roles="guest" type="deleteNonDurableQueue"/>
+            <permission roles="guest" type="consume"/>
+            <permission roles="guest" type="send"/>
+         </security-setting>
+      </security-settings>
+
+   <addresses>
+         <address name="exampleQueue">
+            <anycast>
+               <queue name="exampleQueue"/>
+            </anycast>
+         </address>
+      </addresses>
+   </core>
+</configuration>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/management.xml
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/management.xml b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/management.xml
new file mode 100644
index 0000000..9d31f6a
--- /dev/null
+++ b/examples/features/standard/jmx-ssl/src/main/resources/activemq/server0/management.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License. You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<management-context xmlns="http://activemq.org/schema">
+   <connector
+         connector-port="1099"
+         connector-host="localhost"
+         secured="true"
+         key-store-path="${data.dir}/../etc/activemq.example.keystore"
+         key-store-password="activemqexample"
+         trust-store-path="${data.dir}/../etc/activemq.example.truststore"
+         trust-store-password="activemqexample"/>
+   <authorisation>
+      <whitelist>
+         <entry domain="hawtio"/>
+      </whitelist>
+      <default-access>
+         <access method="list*" roles="view,update,amq,guest"/>
+         <access method="get*" roles="view,update,amq,guest"/>
+         <access method="is*" roles="view,update,amq,guest"/>
+         <access method="set*" roles="update,amq,guest"/>
+         <access method="*" roles="amq,guest"/>
+      </default-access>
+      <role-access>
+         <match domain="org.apache.activemq.apache">
+            <access method="list*" roles="view,update,amq,guest"/>
+            <access method="get*" roles="view,update,amq,guest"/>
+            <access method="is*" roles="view,update,amq,guest"/>
+            <access method="set*" roles="update,amq,guest"/>
+            <access method="*" roles="amq,guest"/>
+         </match>
+         <!--example of how to configure a specific object-->
+         <!--<match domain="org.apache.activemq.apache" key="subcomponent=queues">
+            <access method="list*" roles="view,update,amq"/>
+            <access method="get*" roles="view,update,amq"/>
+            <access method="is*" roles="view,update,amq"/>
+            <access method="set*" roles="update,amq"/>
+            <access method="*" roles="amq"/>
+         </match>-->
+      </role-access>
+   </authorisation>
+</management-context>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx-ssl/src/main/resources/jndi.properties
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx-ssl/src/main/resources/jndi.properties b/examples/features/standard/jmx-ssl/src/main/resources/jndi.properties
new file mode 100644
index 0000000..93537c4
--- /dev/null
+++ b/examples/features/standard/jmx-ssl/src/main/resources/jndi.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
+connectionFactory.ConnectionFactory=tcp://localhost:61616
+queue.queue/exampleQueue=exampleQueue

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx/pom.xml
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx/pom.xml b/examples/features/standard/jmx/pom.xml
index f78c1f3..bca7105 100644
--- a/examples/features/standard/jmx/pom.xml
+++ b/examples/features/standard/jmx/pom.xml
@@ -61,6 +61,7 @@ under the License.
                   </goals>
                   <configuration>
                      <ignore>${noServer}</ignore>
+                     <javaOptions>-Djava.rmi.server.hostname=localhost</javaOptions>
                   </configuration>
                </execution>
                <execution>
@@ -69,7 +70,6 @@ under the License.
                      <goal>cli</goal>
                   </goals>
                   <configuration>
-                     <debug>true</debug>
                      <ignore>${noServer}</ignore>
                      <spawn>true</spawn>
                      <testURI>tcp://localhost:61616</testURI>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx/readme.html
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx/readme.html b/examples/features/standard/jmx/readme.html
index fe981c6..7106e34 100644
--- a/examples/features/standard/jmx/readme.html
+++ b/examples/features/standard/jmx/readme.html
@@ -36,9 +36,8 @@ under the License.
      <p>ActiveMQ Artemis exposes its managed resources by default on the platform MBeanServer.</p>
      <p>To access this MBeanServer remotely, add the following to the management.xml configuration:
          <pre class="prettyprint">
-             <code><connector connector-port="1099" connector-host="127.0.0.1"/></code>
+             <code><connector connector-port="1099" connector-host="localhost"/></code>
         </pre>
-        <p>If the example does not work then try changing the host to the ip address of the machine running this example on</p>
         <p>With these properties, ActiveMQ Artemis server will be manageable remotely using standard JMX URL on port <code>1099</code>.</p>
      </p>
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java b/examples/features/standard/jmx/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
index b59f419..9223a5e 100644
--- a/examples/features/standard/jmx/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
+++ b/examples/features/standard/jmx/src/main/java/org/apache/activemq/artemis/jms/example/JMXExample.java
@@ -79,6 +79,7 @@ public class JMXExample {
          ObjectName on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(queue.getQueueName()), SimpleString.toSimpleString(queue.getQueueName()), RoutingType.ANYCAST);
 
          // Step 10. Create JMX Connector to connect to the server's MBeanServer
+         //we dont actually need credentials as the guest login i sused but this is how its done
          HashMap env = new HashMap();
          String[] creds = {"guest", "guest"};
          env.put(JMXConnector.CREDENTIALS, creds);

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/jmx/src/main/resources/activemq/server0/management.xml
----------------------------------------------------------------------
diff --git a/examples/features/standard/jmx/src/main/resources/activemq/server0/management.xml b/examples/features/standard/jmx/src/main/resources/activemq/server0/management.xml
index 182bb1f..86d29a1 100644
--- a/examples/features/standard/jmx/src/main/resources/activemq/server0/management.xml
+++ b/examples/features/standard/jmx/src/main/resources/activemq/server0/management.xml
@@ -16,7 +16,7 @@
   ~ limitations under the License.
   -->
 <management-context xmlns="http://activemq.org/schema">
-   <connector connector-port="1099" connector-host="127.0.0.1"/>
+   <connector connector-port="1099" connector-host="localhost"/>
    <authorisation>
       <whitelist>
          <entry domain="hawtio"/>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/message-counters/pom.xml
----------------------------------------------------------------------
diff --git a/examples/features/standard/message-counters/pom.xml b/examples/features/standard/message-counters/pom.xml
index 8f745a3..d30d90b 100644
--- a/examples/features/standard/message-counters/pom.xml
+++ b/examples/features/standard/message-counters/pom.xml
@@ -61,6 +61,7 @@ under the License.
                   </goals>
                   <configuration>
                      <ignore>${noServer}</ignore>
+                     <javaOptions>-Djava.rmi.server.hostname=localhost</javaOptions>
                   </configuration>
                </execution>
                <execution>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/a64d7c2e/examples/features/standard/message-counters/src/main/java/org/apache/activemq/artemis/jms/example/MessageCounterExample.java
----------------------------------------------------------------------
diff --git a/examples/features/standard/message-counters/src/main/java/org/apache/activemq/artemis/jms/example/MessageCounterExample.java b/examples/features/standard/message-counters/src/main/java/org/apache/activemq/artemis/jms/example/MessageCounterExample.java
index 16947d1..0a8dadc 100644
--- a/examples/features/standard/message-counters/src/main/java/org/apache/activemq/artemis/jms/example/MessageCounterExample.java
+++ b/examples/features/standard/message-counters/src/main/java/org/apache/activemq/artemis/jms/example/MessageCounterExample.java
@@ -75,6 +75,7 @@ public class MessageCounterExample {
 
          // Step 7. Use JMX to retrieve the message counters using the JMSQueueControl
          ObjectName on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(queue.getQueueName()), SimpleString.toSimpleString(queue.getQueueName()), RoutingType.ANYCAST);
+         //we dont actually need credentials as the guest login i sused but this is how its done
          HashMap env = new HashMap();
          String[] creds = {"guest", "guest"};
          env.put(JMXConnector.CREDENTIALS, creds);