You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2014/12/08 16:49:41 UTC

[10/25] activemq-6 git commit: ACTIVEMQ6-9 - port to markdown

http://git-wip-us.apache.org/repos/asf/activemq-6/blob/4245a6b4/docs/user-manual/en/management.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/management.md b/docs/user-manual/en/management.md
new file mode 100644
index 0000000..5c37827
--- /dev/null
+++ b/docs/user-manual/en/management.md
@@ -0,0 +1,1094 @@
+Management
+==========
+
+ActiveMQ has an extensive management API that allows a user to modify a
+server configuration, create new resources (e.g. JMS queues and topics),
+inspect these resources (e.g. how many messages are currently held in a
+queue) and interact with it (e.g. to remove messages from a queue). All
+the operations allows a client to *manage* ActiveMQ. It also allows
+clients to subscribe to management notifications.
+
+There are 3 ways to manage ActiveMQ:
+
+-   Using JMX -- JMX is the standard way to manage Java applications
+
+-   Using the core API -- management operations are sent to ActiveMQ
+    server using *core messages*
+
+-   Using the JMS API -- management operations are sent to ActiveMQ
+    server using *JMS messages*
+
+Although there are 3 different ways to manage ActiveMQ each API supports
+the same functionality. If it is possible to manage a resource using JMX
+it is also possible to achieve the same result using Core messages or
+JMS messages.
+
+This choice depends on your requirements, your application settings and
+your environment to decide which way suits you best.
+
+The Management API
+==================
+
+Regardless of the way you *invoke* management operations, the management
+API is the same.
+
+For each *managed resource*, there exists a Java interface describing
+what can be invoked for this type of resource.
+
+ActiveMQ exposes its managed resources in 2 packages:
+
+-   *Core* resources are located in the
+    `org.apache.activemq.api.core.management` package
+
+-   *JMS* resources are located in the
+    `org.apache.activemq.api.jms.management` package
+
+The way to invoke a *management operations* depends whether JMX, core
+messages, or JMS messages are used.
+
+> **Note**
+>
+> A few management operations requires a `filter` parameter to chose
+> which messages are involved by the operation. Passing `null` or an
+> empty string means that the management operation will be performed on
+> *all messages*.
+
+Core Management API
+-------------------
+
+ActiveMQ defines a core management API to manage core resources. For
+full details of the API please consult the javadoc. In summary:
+
+### Core Server Management
+
+-   Listing, creating, deploying and destroying queues
+
+    A list of deployed core queues can be retrieved using the
+    `getQueueNames()` method.
+
+    Core queues can be created or destroyed using the management
+    operations `createQueue()` or `deployQueue()` or `destroyQueue()`)on
+    the `ActiveMQServerControl` (with the ObjectName
+    `org.apache.activemq:module=Core,type=Server` or the resource name
+    `core.server`)
+
+    `createQueue` will fail if the queue already exists while
+    `deployQueue` will do nothing.
+
+-   Pausing and resuming Queues
+
+    The `QueueControl` can pause and resume the underlying queue. When a
+    queue is paused, it will receive messages but will not deliver them.
+    When it's resumed, it'll begin delivering the queued messages, if
+    any.
+
+-   Listing and closing remote connections
+
+    Client's remote addresses can be retrieved using
+    `listRemoteAddresses()`. It is also possible to close the
+    connections associated with a remote address using the
+    `closeConnectionsForAddress()` method.
+
+    Alternatively, connection IDs can be listed using
+    `listConnectionIDs()` and all the sessions for a given connection ID
+    can be listed using `listSessions()`.
+
+-   Transaction heuristic operations
+
+    In case of a server crash, when the server restarts, it it possible
+    that some transaction requires manual intervention. The
+    `listPreparedTransactions()` method lists the transactions which are
+    in the prepared states (the transactions are represented as opaque
+    Base64 Strings.) To commit or rollback a given prepared transaction,
+    the `commitPreparedTransaction()` or `rollbackPreparedTransaction()`
+    method can be used to resolve heuristic transactions. Heuristically
+    completed transactions can be listed using the
+    `listHeuristicCommittedTransactions()` and
+    `listHeuristicRolledBackTransactions` methods.
+
+-   Enabling and resetting Message counters
+
+    Message counters can be enabled or disabled using the
+    `enableMessageCounters()` or `disableMessageCounters()` method. To
+    reset message counters, it is possible to invoke
+    `resetAllMessageCounters()` and `resetAllMessageCounterHistories()`
+    methods.
+
+-   Retrieving the server configuration and attributes
+
+    The `ActiveMQServerControl` exposes ActiveMQ server configuration
+    through all its attributes (e.g. `getVersion()` method to retrieve
+    the server's version, etc.)
+
+-   Listing, creating and destroying Core bridges and diverts
+
+    A list of deployed core bridges (resp. diverts) can be retrieved
+    using the `getBridgeNames()` (resp. `getDivertNames()`) method.
+
+    Core bridges (resp. diverts) can be created or destroyed using the
+    management operations `createBridge()` and `destroyBridge()` (resp.
+    `createDivert()` and `destroyDivert()`) on the
+    `ActiveMQServerControl` (with the ObjectName
+    `org.apache.activemq:module=Core,type=Server` or the resource name
+    `core.server`).
+
+-   It is possible to stop the server and force failover to occur with
+    any currently attached clients.
+
+    to do this use the `forceFailover()` on the `ActiveMQServerControl`
+    (with the ObjectName `org.apache.activemq:module=Core,type=Server`
+    or the resource name `core.server`)
+
+    > **Note**
+    >
+    > Since this method actually stops the server you will probably
+    > receive some sort of error depending on which management service
+    > you use to call it.
+
+### Core Address Management
+
+Core addresses can be managed using the `AddressControl` class (with the
+ObjectName `org.apache.activemq:module=Core,type=Address,name="<the
+                  address name>"` or the resource name
+`core.address.<the
+                  address name>`).
+
+-   Modifying roles and permissions for an address
+
+    You can add or remove roles associated to a queue using the
+    `addRole()` or `removeRole()` methods. You can list all the roles
+    associated to the queue with the `getRoles()` method
+
+### Core Queue Management
+
+The bulk of the core management API deals with core queues. The
+`QueueControl` class defines the Core queue management operations (with
+the ObjectName
+`org.apache.activemq:module=Core,type=Queue,address="<the bound
+                  address>",name="<the queue name>"` or the resource
+name `core.queue.<the queue name>`).
+
+Most of the management operations on queues take either a single message
+ID (e.g. to remove a single message) or a filter (e.g. to expire all
+messages with a given property.)
+
+-   Expiring, sending to a dead letter address and moving messages
+
+    Messages can be expired from a queue by using the `expireMessages()`
+    method. If an expiry address is defined, messages will be sent to
+    it, otherwise they are discarded. The queue's expiry address can be
+    set with the `setExpiryAddress()` method.
+
+    Messages can also be sent to a dead letter address with the
+    `sendMessagesToDeadLetterAddress()` method. It returns the number of
+    messages which are sent to the dead letter address. If a dead letter
+    address is not defined, message are removed from the queue and
+    discarded. The queue's dead letter address can be set with the
+    `setDeadLetterAddress()` method.
+
+    Messages can also be moved from a queue to another queue by using
+    the `moveMessages()` method.
+
+-   Listing and removing messages
+
+    Messages can be listed from a queue by using the `listMessages()`
+    method which returns an array of `Map`, one `Map` for each message.
+
+    Messages can also be removed from the queue by using the
+    `removeMessages()` method which returns a `boolean` for the single
+    message ID variant or the number of removed messages for the filter
+    variant. The `removeMessages()` method takes a `filter` argument to
+    remove only filtered messages. Setting the filter to an empty string
+    will in effect remove all messages.
+
+-   Counting messages
+
+    The number of messages in a queue is returned by the
+    `getMessageCount()` method. Alternatively, the `countMessages()`
+    will return the number of messages in the queue which *match a given
+    filter*
+
+-   Changing message priority
+
+    The message priority can be changed by using the
+    `changeMessagesPriority()` method which returns a `boolean` for the
+    single message ID variant or the number of updated messages for the
+    filter variant.
+
+-   Message counters
+
+    Message counters can be listed for a queue with the
+    `listMessageCounter()` and `listMessageCounterHistory()` methods
+    (see ?). The message counters can also be reset for a single queue
+    using the `resetMessageCounter()` method.
+
+-   Retrieving the queue attributes
+
+    The `QueueControl` exposes Core queue settings through its
+    attributes (e.g. `getFilter()` to retrieve the queue's filter if it
+    was created with one, `isDurable()` to know whether the queue is
+    durable or not, etc.)
+
+-   Pausing and resuming Queues
+
+    The `QueueControl` can pause and resume the underlying queue. When a
+    queue is paused, it will receive messages but will not deliver them.
+    When it's resume, it'll begin delivering the queued messages, if
+    any.
+
+### Other Core Resources Management
+
+ActiveMQ allows to start and stop its remote resources (acceptors,
+diverts, bridges, etc.) so that a server can be taken off line for a
+given period of time without stopping it completely (e.g. if other
+management operations must be performed such as resolving heuristic
+transactions). These resources are:
+
+-   Acceptors
+
+    They can be started or stopped using the `start()` or. `stop()`
+    method on the `AcceptorControl` class (with the ObjectName
+    `org.apache.activemq:module=Core,type=Acceptor,name="<the acceptor
+                            name>"` or the resource name
+    `core.acceptor.<the
+                            address name>`). The acceptors parameters
+    can be retrieved using the `AcceptorControl` attributes (see ?)
+
+-   Diverts
+
+    They can be started or stopped using the `start()` or `stop()`
+    method on the `DivertControl` class (with the ObjectName
+    `org.apache.activemq:module=Core,type=Divert,name=<the divert name>`
+    or the resource name `core.divert.<the divert name>`). Diverts
+    parameters can be retrieved using the `DivertControl` attributes
+    (see ?)
+
+-   Bridges
+
+    They can be started or stopped using the `start()` (resp. `stop()`)
+    method on the `BridgeControl` class (with the ObjectName
+    `org.apache.activemq:module=Core,type=Bridge,name="<the bridge
+                            name>"` or the resource name
+    `core.bridge.<the bridge
+                            name>`). Bridges parameters can be retrieved
+    using the `BridgeControl` attributes (see ?)
+
+-   Broadcast groups
+
+    They can be started or stopped using the `start()` or `stop()`
+    method on the `BroadcastGroupControl` class (with the ObjectName
+    `org.apache.activemq:module=Core,type=BroadcastGroup,name="<the broadcast group
+                            name>"` or the resource name
+    `core.broadcastgroup.<the broadcast group name>`). Broadcast groups
+    parameters can be retrieved using the `BroadcastGroupControl`
+    attributes (see ?)
+
+-   Discovery groups
+
+    They can be started or stopped using the `start()` or `stop()`
+    method on the `DiscoveryGroupControl` class (with the ObjectName
+    `org.apache.activemq:module=Core,type=DiscoveryGroup,name="<the discovery group
+                            name>"` or the resource name
+    `core.discovery.<the
+                            discovery group name>`). Discovery groups
+    parameters can be retrieved using the `DiscoveryGroupControl`
+    attributes (see ?)
+
+-   Cluster connections
+
+    They can be started or stopped using the `start()` or `stop()`
+    method on the `ClusterConnectionControl` class (with the ObjectName
+    `org.apache.activemq:module=Core,type=ClusterConnection,name="<the cluster
+                            connection name>"` or the resource name
+    `core.clusterconnection.<the cluster connection name>`). Cluster
+    connections parameters can be retrieved using the
+    `ClusterConnectionControl` attributes (see ?)
+
+JMS Management API
+------------------
+
+ActiveMQ defines a JMS Management API to manage JMS *administrated
+objects* (i.e. JMS queues, topics and connection factories).
+
+### JMS Server Management
+
+JMS Resources (connection factories and destinations) can be created
+using the `JMSServerControl` class (with the ObjectName
+`org.apache.activemq:module=JMS,type=Server` or the resource name
+`jms.server`).
+
+-   Listing, creating, destroying connection factories
+
+    Names of the deployed connection factories can be retrieved by the
+    `getConnectionFactoryNames()` method.
+
+    JMS connection factories can be created or destroyed using the
+    `createConnectionFactory()` methods or `destroyConnectionFactory()`
+    methods. These connection factories are bound to JNDI so that JMS
+    clients can look them up. If a graphical console is used to create
+    the connection factories, the transport parameters are specified in
+    the text field input as a comma-separated list of key=value (e.g.
+    `key1=10, key2="value", key3=false`). If there are multiple
+    transports defined, you need to enclose the key/value pairs between
+    curly braces. For example `{key=10}, {key=20}`. In that case, the
+    first `key` will be associated to the first transport configuration
+    and the second `key` will be associated to the second transport
+    configuration (see ? for a list of the transport parameters)
+
+-   Listing, creating, destroying queues
+
+    Names of the deployed JMS queues can be retrieved by the
+    `getQueueNames()` method.
+
+    JMS queues can be created or destroyed using the `createQueue()`
+    methods or `destroyQueue()` methods. These queues are bound to JNDI
+    so that JMS clients can look them up
+
+-   Listing, creating/destroying topics
+
+    Names of the deployed topics can be retrieved by the
+    `getTopicNames()` method.
+
+    JMS topics can be created or destroyed using the `createTopic()` or
+    `destroyTopic()` methods. These topics are bound to JNDI so that JMS
+    clients can look them up
+
+-   Listing and closing remote connections
+
+    JMS Clients remote addresses can be retrieved using
+    `listRemoteAddresses()`. It is also possible to close the
+    connections associated with a remote address using the
+    `closeConnectionsForAddress()` method.
+
+    Alternatively, connection IDs can be listed using
+    `listConnectionIDs()` and all the sessions for a given connection ID
+    can be listed using `listSessions()`.
+
+### JMS ConnectionFactory Management
+
+JMS Connection Factories can be managed using the
+`ConnectionFactoryControl` class (with the ObjectName
+`org.apache.activemq:module=JMS,type=ConnectionFactory,name="<the connection factory
+                  name>"` or the resource name
+`jms.connectionfactory.<the
+                  connection factory name>`).
+
+-   Retrieving connection factory attributes
+
+    The `ConnectionFactoryControl` exposes JMS ConnectionFactory
+    configuration through its attributes (e.g. `getConsumerWindowSize()`
+    to retrieve the consumer window size for flow control,
+    `isBlockOnNonDurableSend()` to know whether the producers created
+    from the connection factory will block or not when sending
+    non-durable messages, etc.)
+
+### JMS Queue Management
+
+JMS queues can be managed using the `JMSQueueControl` class (with the
+ObjectName `org.apache.activemq:module=JMS,type=Queue,name="<the queue
+                  name>"` or the resource name `jms.queue.<the queue
+                  name>`).
+
+*The management operations on a JMS queue are very similar to the
+operations on a core queue.*
+
+-   Expiring, sending to a dead letter address and moving messages
+
+    Messages can be expired from a queue by using the `expireMessages()`
+    method. If an expiry address is defined, messages will be sent to
+    it, otherwise they are discarded. The queue's expiry address can be
+    set with the `setExpiryAddress()` method.
+
+    Messages can also be sent to a dead letter address with the
+    `sendMessagesToDeadLetterAddress()` method. It returns the number of
+    messages which are sent to the dead letter address. If a dead letter
+    address is not defined, message are removed from the queue and
+    discarded. The queue's dead letter address can be set with the
+    `setDeadLetterAddress()` method.
+
+    Messages can also be moved from a queue to another queue by using
+    the `moveMessages()` method.
+
+-   Listing and removing messages
+
+    Messages can be listed from a queue by using the `listMessages()`
+    method which returns an array of `Map`, one `Map` for each message.
+
+    Messages can also be removed from the queue by using the
+    `removeMessages()` method which returns a `boolean` for the single
+    message ID variant or the number of removed messages for the filter
+    variant. The `removeMessages()` method takes a `filter` argument to
+    remove only filtered messages. Setting the filter to an empty string
+    will in effect remove all messages.
+
+-   Counting messages
+
+    The number of messages in a queue is returned by the
+    `getMessageCount()` method. Alternatively, the `countMessages()`
+    will return the number of messages in the queue which *match a given
+    filter*
+
+-   Changing message priority
+
+    The message priority can be changed by using the
+    `changeMessagesPriority()` method which returns a `boolean` for the
+    single message ID variant or the number of updated messages for the
+    filter variant.
+
+-   Message counters
+
+    Message counters can be listed for a queue with the
+    `listMessageCounter()` and `listMessageCounterHistory()` methods
+    (see ?)
+
+-   Retrieving the queue attributes
+
+    The `JMSQueueControl` exposes JMS queue settings through its
+    attributes (e.g. `isTemporary()` to know whether the queue is
+    temporary or not, `isDurable()` to know whether the queue is durable
+    or not, etc.)
+
+-   Pausing and resuming queues
+
+    The `JMSQueueControl` can pause and resume the underlying queue.
+    When the queue is paused it will continue to receive messages but
+    will not deliver them. When resumed again it will deliver the
+    enqueued messages, if any.
+
+### JMS Topic Management
+
+JMS Topics can be managed using the `TopicControl` class (with the
+ObjectName `org.apache.activemq:module=JMS,type=Topic,name="<the topic
+                  name>"` or the resource name `jms.topic.<the topic
+                  name>`).
+
+-   Listing subscriptions and messages
+
+    JMS topics subscriptions can be listed using the
+    `listAllSubscriptions()`, `listDurableSubscriptions()`,
+    `listNonDurableSubscriptions()` methods. These methods return arrays
+    of `Object` representing the subscriptions information (subscription
+    name, client ID, durability, message count, etc.). It is also
+    possible to list the JMS messages for a given subscription with the
+    `listMessagesForSubscription()` method.
+
+-   Dropping subscriptions
+
+    Durable subscriptions can be dropped from the topic using the
+    `dropDurableSubscription()` method.
+
+-   Counting subscriptions messages
+
+    The `countMessagesForSubscription()` method can be used to know the
+    number of messages held for a given subscription (with an optional
+    message selector to know the number of messages matching the
+    selector)
+
+Using Management Via JMX
+========================
+
+ActiveMQ can be managed using
+[JMX](http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html).
+
+The management API is exposed by ActiveMQ using MBeans interfaces.
+ActiveMQ registers its resources with the domain `org.apache.activemq`.
+
+For example, the `ObjectName` to manage a JMS Queue `exampleQueue` is:
+
+    org.apache.activemq:module=JMS,type=Queue,name="exampleQueue"
+
+and the MBean is:
+
+    org.apache.activemq.api.jms.management.JMSQueueControl
+
+The MBean's `ObjectName` are built using the helper class
+`org.apache.activemq.api.core.management.ObjectNameBuilder`. You can
+also use `jconsole` to find the `ObjectName` of the MBeans you want to
+manage.
+
+Managing ActiveMQ using JMX is identical to management of any Java
+Applications using JMX. It can be done by reflection or by creating
+proxies of the MBeans.
+
+Configuring JMX
+---------------
+
+By default, JMX is enabled to manage ActiveMQ. It can be disabled by
+setting `jmx-management-enabled` to `false` in
+`activemq-configuration.xml`:
+
+    <!-- false to disable JMX management for ActiveMQ -->
+    <jmx-management-enabled>false</jmx-management-enabled>
+
+If JMX is enabled, ActiveMQ can be managed locally using `jconsole`.
+
+> **Note**
+>
+> Remote connections to JMX are not enabled by default for security
+> reasons. Please refer to [Java Management
+> guide](http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html)
+> to configure the server for remote management (system properties must
+> be set in `run.sh` or `run.bat` scripts).
+
+By default, ActiveMQ server uses the JMX domain "org.apache.activemq".
+To manage several ActiveMQ servers from the *same* MBeanServer, the JMX
+domain can be configured for each individual ActiveMQ server by setting
+`jmx-domain` in `activemq-configuration.xml`:
+
+    <!-- use a specific JMX domain for ActiveMQ MBeans -->
+    <jmx-domain>my.org.apache.activemq</jmx-domain>
+
+### MBeanServer configuration
+
+When ActiveMQ is run in standalone, it uses the Java Virtual Machine's
+`Platform MBeanServer` to register its MBeans. This is configured in
+JBoss Microcontainer Beans file (see ?):
+
+    <!-- MBeanServer -->
+    <bean name="MBeanServer" class="javax.management.MBeanServer">
+       <constructor factoryClass="java.lang.management.ManagementFactory"
+                       factoryMethod="getPlatformMBeanServer" />
+    </bean>
+
+When it is integrated in JBoss AS 5+, it uses the Application Server's
+own MBean Server so that it can be managed using AS 5's jmx-console:
+
+    <!-- MBeanServer -->
+    <bean name="MBeanServer" class="javax.management.MBeanServer">
+       <constructor factoryClass="org.jboss.mx.util.MBeanServerLocator"
+                       factoryMethod="locateJBoss" />
+    </bean>
+
+Example
+-------
+
+See ? for an example which shows how to use a remote connection to JMX
+and MBean proxies to manage ActiveMQ.
+
+Using Management Via Core API
+=============================
+
+The core management API in ActiveMQ is called by sending Core messages
+to a special address, the *management address*.
+
+*Management messages* are regular Core messages with well-known
+properties that the server needs to understand to interact with the
+management API:
+
+-   The name of the managed resource
+
+-   The name of the management operation
+
+-   The parameters of the management operation
+
+When such a management message is sent to the management address,
+ActiveMQ server will handle it, extract the information, invoke the
+operation on the managed resources and send a *management reply* to the
+management message's reply-to address (specified by
+`ClientMessageImpl.REPLYTO_HEADER_NAME`).
+
+A `ClientConsumer` can be used to consume the management reply and
+retrieve the result of the operation (if any) stored in the reply's
+body. For portability, results are returned as a [JSON](http://json.org)
+String rather than Java Serialization (the
+`org.apache.activemq.api.core.management.ManagementHelper` can be used
+to convert the JSON string to Java objects).
+
+These steps can be simplified to make it easier to invoke management
+operations using Core messages:
+
+1.  Create a `ClientRequestor` to send messages to the management
+    address and receive replies
+
+2.  Create a `ClientMessage`
+
+3.  Use the helper class
+    `org.apache.activemq.api.core.management.ManagementHelper` to fill
+    the message with the management properties
+
+4.  Send the message using the `ClientRequestor`
+
+5.  Use the helper class
+    `org.apache.activemq.api.core.management.ManagementHelper` to
+    retrieve the operation result from the management reply
+
+For example, to find out the number of messages in the core queue
+`exampleQueue`:
+
+    ClientSession session = ...
+    ClientRequestor requestor = new ClientRequestor(session, "jms.queue.activemq.management");
+    ClientMessage message = session.createMessage(false);
+    ManagementHelper.putAttribute(message, "core.queue.exampleQueue", "messageCount");
+    session.start();
+    ClientMessage reply = requestor.request(m);
+    int count = (Integer) ManagementHelper.getResult(reply);
+    System.out.println("There are " + count + " messages in exampleQueue");
+
+Management operation name and parameters must conform to the Java
+interfaces defined in the `management` packages.
+
+Names of the resources are built using the helper class
+`org.apache.activemq.api.core.management.ResourceNames` and are
+straightforward (`core.queue.exampleQueue` for the Core Queue
+`exampleQueue`, `jms.topic.exampleTopic` for the JMS Topic
+`exampleTopic`, etc.).
+
+Configuring Core Management
+---------------------------
+
+The management address to send management messages is configured in
+`activemq-configuration.xml`:
+
+    <management-address>jms.queue.activemq.management</management-address>
+
+By default, the address is `jms.queue.activemq.management` (it is
+prepended by "jms.queue" so that JMS clients can also send management
+messages).
+
+The management address requires a *special* user permission `manage` to
+be able to receive and handle management messages. This is also
+configured in activemq-configuration.xml:
+
+    <!-- users with the admin role will be allowed to manage -->
+    <!-- ActiveMQ using management messages        -->
+    <security-setting match="jms.queue.activemq.management">
+       <permission type="manage" roles="admin" />
+    </security-setting>
+
+Using Management Via JMS
+========================
+
+Using JMS messages to manage ActiveMQ is very similar to using core API.
+
+An important difference is that JMS requires a JMS queue to send the
+messages to (instead of an address for the core API).
+
+The *management queue* is a special queue and needs to be instantiated
+directly by the client:
+
+    Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management");
+
+All the other steps are the same than for the Core API but they use JMS
+API instead:
+
+1.  create a `QueueRequestor` to send messages to the management address
+    and receive replies
+
+2.  create a `Message`
+
+3.  use the helper class
+    `org.apache.activemq.api.jms.management.JMSManagementHelper` to fill
+    the message with the management properties
+
+4.  send the message using the `QueueRequestor`
+
+5.  use the helper class
+    `org.apache.activemq.api.jms.management.JMSManagementHelper` to
+    retrieve the operation result from the management reply
+
+For example, to know the number of messages in the JMS queue
+`exampleQueue`:
+
+    Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management");
+
+    QueueSession session = ...
+    QueueRequestor requestor = new QueueRequestor(session, managementQueue);
+    connection.start();
+    Message message = session.createMessage();
+    JMSManagementHelper.putAttribute(message, "jms.queue.exampleQueue", "messageCount");
+    Message reply = requestor.request(message);
+    int count = (Integer)JMSManagementHelper.getResult(reply);
+    System.out.println("There are " + count + " messages in exampleQueue");
+
+Configuring JMS Management
+--------------------------
+
+Whether JMS or the core API is used for management, the configuration
+steps are the same (see ?).
+
+Example
+-------
+
+See ? for an example which shows how to use JMS messages to manage
+ActiveMQ server.
+
+Management Notifications
+========================
+
+ActiveMQ emits *notifications* to inform listeners of potentially
+interesting events (creation of new resources, security violation,
+etc.).
+
+These notifications can be received by 3 different ways:
+
+-   JMX notifications
+
+-   Core messages
+
+-   JMS messages
+
+JMX Notifications
+-----------------
+
+If JMX is enabled (see ?), JMX notifications can be received by
+subscribing to 2 MBeans:
+
+-   `org.apache.activemq:module=Core,type=Server` for notifications on
+    *Core* resources
+
+-   `org.apache.activemq:module=JMS,type=Server` for notifications on
+    *JMS* resources
+
+Core Messages Notifications
+---------------------------
+
+ActiveMQ defines a special *management notification address*. Core
+queues can be bound to this address so that clients will receive
+management notifications as Core messages
+
+A Core client which wants to receive management notifications must
+create a core queue bound to the management notification address. It can
+then receive the notifications from its queue.
+
+Notifications messages are regular core messages with additional
+properties corresponding to the notification (its type, when it
+occurred, the resources which were concerned, etc.).
+
+Since notifications are regular core messages, it is possible to use
+message selectors to filter out notifications and receives only a subset
+of all the notifications emitted by the server.
+
+### Configuring The Core Management Notification Address
+
+The management notification address to receive management notifications
+is configured in `activemq-configuration.xml`:
+
+    <management-notification-address>activemq.notifications</management-notification-address>
+
+By default, the address is `activemq.notifications`.
+
+JMS Messages Notifications
+--------------------------
+
+ActiveMQ's notifications can also be received using JMS messages.
+
+It is similar to receiving notifications using Core API but an important
+difference is that JMS requires a JMS Destination to receive the
+messages (preferably a Topic).
+
+To use a JMS Destination to receive management notifications, you must
+change the server's management notification address to start with
+`jms.queue` if it is a JMS Queue or `jms.topic` if it is a JMS Topic:
+
+    <!-- notifications will be consumed from "notificationsTopic" JMS Topic -->
+    <management-notification-address>jms.topic.notificationsTopic</management-notification-address>
+
+Once the notification topic is created, you can receive messages from it
+or set a `MessageListener`:
+
+    Topic notificationsTopic = ActiveMQJMSClient.createTopic("notificationsTopic");
+
+    Session session = ...
+    MessageConsumer notificationConsumer = session.createConsumer(notificationsTopic);
+    notificationConsumer.setMessageListener(new MessageListener()
+    {
+       public void onMessage(Message notif)
+       {
+          System.out.println("------------------------");
+          System.out.println("Received notification:");
+          try
+          {
+             Enumeration propertyNames = notif.getPropertyNames();
+             while (propertyNames.hasMoreElements())
+             {
+                String propertyName = (String)propertyNames.nextElement();
+                System.out.format("  %s: %s\n", propertyName, notif.getObjectProperty(propertyName));
+             }
+          }
+          catch (JMSException e)
+          {
+          }
+          System.out.println("------------------------");
+       }
+    });
+
+Example
+-------
+
+See ? for an example which shows how to use a JMS `MessageListener` to
+receive management notifications from ActiveMQ server.
+
+Notification Types and Headers
+------------------------------
+
+Below is a list of all the different kinds of notifications as well as
+which headers are on the messages. Every notification has a
+`_HQ_NotifType` (value noted in parentheses) and `_HQ_NotifTimestamp`
+header. The timestamp is the un-formatted result of a call to
+`java.lang.System.currentTimeMillis()`.
+
+-   `BINDING_ADDED` (0)
+
+    `_HQ_Binding_Type`, `_HQ_Address`, `_HQ_ClusterName`,
+    `_HQ_RoutingName`, `_HQ_Binding_ID`, `_HQ_Distance`,
+    `_HQ_FilterString`
+
+-   `BINDING_REMOVED` (1)
+
+    `_HQ_Address`, `_HQ_ClusterName`, `_HQ_RoutingName`,
+    `_HQ_Binding_ID`, `_HQ_Distance`, `_HQ_FilterString`
+
+-   `CONSUMER_CREATED` (2)
+
+    `_HQ_Address`, `_HQ_ClusterName`, `_HQ_RoutingName`, `_HQ_Distance`,
+    `_HQ_ConsumerCount`, `_HQ_User`, `_HQ_RemoteAddress`,
+    `_HQ_SessionName`, `_HQ_FilterString`
+
+-   `CONSUMER_CLOSED` (3)
+
+    `_HQ_Address`, `_HQ_ClusterName`, `_HQ_RoutingName`, `_HQ_Distance`,
+    `_HQ_ConsumerCount`, `_HQ_User`, `_HQ_RemoteAddress`,
+    `_HQ_SessionName`, `_HQ_FilterString`
+
+-   `SECURITY_AUTHENTICATION_VIOLATION` (6)
+
+    `_HQ_User`
+
+-   `SECURITY_PERMISSION_VIOLATION` (7)
+
+    `_HQ_Address`, `_HQ_CheckType`, `_HQ_User`
+
+-   `DISCOVERY_GROUP_STARTED` (8)
+
+    `name`
+
+-   `DISCOVERY_GROUP_STOPPED` (9)
+
+    `name`
+
+-   `BROADCAST_GROUP_STARTED` (10)
+
+    `name`
+
+-   `BROADCAST_GROUP_STOPPED` (11)
+
+    `name`
+
+-   `BRIDGE_STARTED` (12)
+
+    `name`
+
+-   `BRIDGE_STOPPED` (13)
+
+    `name`
+
+-   `CLUSTER_CONNECTION_STARTED` (14)
+
+    `name`
+
+-   `CLUSTER_CONNECTION_STOPPED` (15)
+
+    `name`
+
+-   `ACCEPTOR_STARTED` (16)
+
+    `factory`, `id`
+
+-   `ACCEPTOR_STOPPED` (17)
+
+    `factory`, `id`
+
+-   `PROPOSAL` (18)
+
+    `_JBM_ProposalGroupId`, `_JBM_ProposalValue`, `_HQ_Binding_Type`,
+    `_HQ_Address`, `_HQ_Distance`
+
+-   `PROPOSAL_RESPONSE` (19)
+
+    `_JBM_ProposalGroupId`, `_JBM_ProposalValue`,
+    `_JBM_ProposalAltValue`, `_HQ_Binding_Type`, `_HQ_Address`,
+    `_HQ_Distance`
+
+-   `CONSUMER_SLOW` (21)
+
+    `_HQ_Address`, `_HQ_ConsumerCount`, `_HQ_RemoteAddress`,
+    `_HQ_ConnectionName`, `_HQ_ConsumerName`, `_HQ_SessionName`
+
+Message Counters
+================
+
+Message counters can be used to obtain information on queues *over time*
+as ActiveMQ keeps a history on queue metrics.
+
+They can be used to show *trends* on queues. For example, using the
+management API, it would be possible to query the number of messages in
+a queue at regular interval. However, this would not be enough to know
+if the queue is used: the number of messages can remain constant because
+nobody is sending or receiving messages from the queue or because there
+are as many messages sent to the queue than messages consumed from it.
+The number of messages in the queue remains the same in both cases but
+its use is widely different.
+
+Message counters gives additional information about the queues:
+
+-   `count`
+
+    The *total* number of messages added to the queue since the server
+    was started
+
+-   `countDelta`
+
+    the number of messages added to the queue *since the last message
+    counter update*
+
+-   `messageCount`
+
+    The *current* number of messages in the queue
+
+-   `messageCountDelta`
+
+    The *overall* number of messages added/removed from the queue *since
+    the last message counter update*. For example, if
+    `messageCountDelta` is equal to `-10` this means that overall 10
+    messages have been removed from the queue (e.g. 2 messages were
+    added and 12 were removed)
+
+-   `lastAddTimestamp`
+
+    The timestamp of the last time a message was added to the queue
+
+-   `udpateTimestamp`
+
+    The timestamp of the last message counter update
+
+These attributes can be used to determine other meaningful data as well.
+For example, to know specifically how many messages were *consumed* from
+the queue since the last update simply subtract the `messageCountDelta`
+from `countDelta`.
+
+Configuring Message Counters
+----------------------------
+
+By default, message counters are disabled as it might have a small
+negative effect on memory.
+
+To enable message counters, you can set it to `true` in
+`activemq-configuration.xml`:
+
+    <message-counter-enabled>true</message-counter-enabled>
+
+Message counters keeps a history of the queue metrics (10 days by
+default) and samples all the queues at regular interval (10 seconds by
+default). If message counters are enabled, these values should be
+configured to suit your messaging use case in
+`activemq-configuration.xml`:
+
+    <!-- keep history for a week -->
+    <message-counter-max-day-history>7</message-counter-max-day-history>
+    <!-- sample the queues every minute (60000ms) -->
+    <message-counter-sample-period>60000</message-counter-sample-period>
+
+Message counters can be retrieved using the Management API. For example,
+to retrieve message counters on a JMS Queue using JMX:
+
+    // retrieve a connection to ActiveMQ's MBeanServer
+    MBeanServerConnection mbsc = ...
+    JMSQueueControlMBean queueControl = (JMSQueueControl)MBeanServerInvocationHandler.newProxyInstance(mbsc,
+       on,
+       JMSQueueControl.class,
+       false);
+    // message counters are retrieved as a JSON String                                                                                                      
+    String counters = queueControl.listMessageCounter();
+    // use the MessageCounterInfo helper class to manipulate message counters more easily
+    MessageCounterInfo messageCounter = MessageCounterInfo.fromJSON(counters);         
+    System.out.format("%s message(s) in the queue (since last sample: %s)\n",
+    messageCounter.getMessageCount(),
+    messageCounter.getMessageCountDelta());
+
+Example
+-------
+
+See ? for an example which shows how to use message counters to retrieve
+information on a JMS `Queue`.
+
+Administering ActiveMQ Resources Using The JBoss AS Admin Console
+=================================================================
+
+Its possible to create and configure ActiveMQ resources via the admin
+console within the JBoss Application Server.
+
+The Admin Console will allow you to create destinations (JMS Topics and
+Queues) and JMS Connection Factories.
+
+Once logged in to the admin console you will see a JMS Manager item in
+the left hand tree. All ActiveMQ resources will be configured via this.
+This will have a child items for JMS Queues, Topics and Connection
+Factories, clicking on each node will reveal which resources are
+currently available. The following sections explain how to create and
+configure each resource in turn.
+
+JMS Queues
+----------
+
+To create a new JMS Queue click on the JMS Queues item to reveal the
+available queues. On the right hand panel you will see an add a new
+resource button, click on this and then choose the default(JMS Queue)
+template and click continue. The important things to fill in here are
+the name of the queue and the JNDI name of the queue. The JNDI name is
+what you will use to look up the queue in JNDI from your client. For
+most queues this will be the only info you will need to provide as
+sensible defaults are provided for the others. You will also see a
+security roles section near the bottom. If you do not provide any roles
+for this queue then the servers default security configuration will be
+used, after you have created the queue these will be shown in the
+configuration. All configuration values, except the name and JNDI name,
+can be changed via the configuration tab after clicking on the queue in
+the admin console. The following section explains these in more detail
+
+After highlighting the configuration you will see the following screen
+
+![ActiveMQ console1.png](images/console1.png)
+
+The name and JNDI name can't be changed, if you want to change these
+recreate the queue with the appropriate settings. The rest of the
+configuration options, apart from security roles, relate to address
+settings for a particular address. The default address settings are
+picked up from the servers configuration, if you change any of these
+settings or create a queue via the console a new Address Settings entry
+will be added. For a full explanation on Address Settings see ?
+
+To delete a queue simply click on the delete button beside the queue
+name in the main JMS Queues screen. This will also delete any address
+settings or security settings previously created for the queues address
+
+The last part of the configuration options are security roles. If non
+are provided on creation then the servers default security settings will
+be shown. If these are changed or updated then new security settings are
+created for the address of this queue. For more information on security
+setting see ?
+
+It is also possible via the metrics tab to view statistics for this
+queue. This will show statistics such as message count, consumer count
+etc.
+
+Operations can be performed on a queue via the control tab. This will
+allow you to start and stop the queue, list,move,expire and delete
+messages from the queue and other useful operations. To invoke an
+operation click on the button for the operation you want, this will take
+you to a screen where you can parameters for the operation can be set.
+Once set clicking the ok button will invoke the operation, results
+appear at the bottom of the screen.
+
+JMS Topics
+----------
+
+Creating and configuring JMS Topics is almost identical to creating
+queues. The only difference is that the configuration will be applied to
+the queue representing a subscription.
+
+JMS Connection Factories
+------------------------
+
+The format for creating connection factories is the same as for JMS
+Queues and topics apart from the configuration being different. For as
+list of all the connection factory settings see the configuration index