27 KiB
Management
Apache ActiveMQ Artemis has an extensive management API that allows a user to modify a server configuration, create new resources (e.g. addresses and queues), 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 Apache ActiveMQ Artemis. It also allows clients to subscribe to management notifications.
There are 3 ways to manage Apache ActiveMQ Artemis:
-
Using JMX -- JMX is the standard way to manage Java applications
-
Using the core API -- management operations are sent to Apache ActiveMQ Artemis server using core messages
-
Using the JMS API -- management operations are sent to Apache ActiveMQ Artemis server using JMS messages
Although there are 3 different ways to manage Apache ActiveMQ Artemis 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.
This choice depends on your requirements, your application settings and your environment to decide which way suits you best.
In version 2 of Apache ActiveMQ Artemis the syntax used for MBean Object names has changed significantly due to changes in the addressing scheme. See the documentation for each individual resource for details on the new sytanx.
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.
Apache ActiveMQ Artemis exposes its managed resources in the org.apache.activemq.artemis.api.core.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. Passingnull
or an empty string means that the management operation will be performed on all messages.
Apache ActiveMQ Artemis Management API
Apache ActiveMQ Artemis defines a core management API to manage core resources. For full details of the API please consult the javadoc. In summary:
Apache ActiveMQ Artemis 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()
ordeployQueue()
ordestroyQueue()
)on theActiveMQServerControl
(with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>"
or the resource namebroker
)createQueue
will fail if the queue already exists whiledeployQueue
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 thecloseConnectionsForAddress()
method.Alternatively, connection IDs can be listed using
listConnectionIDs()
and all the sessions for a given connection ID can be listed usinglistSessions()
. -
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, thecommitPreparedTransaction()
orrollbackPreparedTransaction()
method can be used to resolve heuristic transactions. Heuristically completed transactions can be listed using thelistHeuristicCommittedTransactions()
andlistHeuristicRolledBackTransactions
methods. -
Enabling and resetting Message counters
Message counters can be enabled or disabled using the
enableMessageCounters()
ordisableMessageCounters()
method. To reset message counters, it is possible to invokeresetAllMessageCounters()
andresetAllMessageCounterHistories()
methods. -
Retrieving the server configuration and attributes
The
ActiveMQServerControl
exposes Apache ActiveMQ Artemis 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()
anddestroyBridge()
(resp.createDivert()
anddestroyDivert()
) on theActiveMQServerControl
(with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>"
or the resource namebroker
). -
It is possible to stop the server and force failover to occur with any currently attached clients.
to do this use the
forceFailover()
on theActiveMQServerControl
(with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>"
or the resource namebroker
)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.
Address Management
Core addresses can be managed using the AddressControl
class (with the
ObjectName org.apache.activemq.artemis:broker="<brokerName>",component=addresses,address="<addressName>"
or the resource name
address.<addressName>
).
-
Modifying roles and permissions for an address
You can add or remove roles associated to a queue using the
addRole()
orremoveRole()
methods. You can list all the roles associated to the queue with thegetRoles()
method
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.artemis:broker="<brokerName>",component=addresses,address="<addressName>",subcomponent=queues,routing-type="<routingType>",queue="<queueName>"
or the resource name queue.<queueName>
).
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 thesetExpiryAddress()
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 thesetDeadLetterAddress()
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 ofMap
, oneMap
for each message.Messages can also be removed from the queue by using the
removeMessages()
method which returns aboolean
for the single message ID variant or the number of removed messages for the filter variant. TheremoveMessages()
method takes afilter
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, thecountMessages()
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 aboolean
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()
andlistMessageCounterHistory()
methods (see Message Counters section). The message counters can also be reset for a single queue using theresetMessageCounter()
method. -
Retrieving the queue attributes
The
QueueControl
exposes 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 Resources Management
Apache ActiveMQ Artemis 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 theAcceptorControl
class (with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>",component=acceptor,name="<acceptorName>"
or the resource nameacceptor.<acceptorName>
). The acceptors parameters can be retrieved using theAcceptorControl
attributes (see Understanding Acceptors) -
Diverts
They can be started or stopped using the
start()
orstop()
method on theDivertControl
class (with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>",component=addresses,address="<addressName>",subcomponent=diverts,divert="<divertName>"
or the resource namedivert.<divertName>
). Diverts parameters can be retrieved using theDivertControl
attributes (see Diverting and Splitting Message Flows)) -
Bridges
They can be started or stopped using the
start()
(resp.stop()
) method on theBridgeControl
class (with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>",component=bridges,name="<bridgeName>"
or the resource namebridge.<the bridge name>
). Bridges parameters can be retrieved using theBridgeControl
attributes (see Core bridges) -
Broadcast groups
They can be started or stopped using the
start()
orstop()
method on theBroadcastGroupControl
class (with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>",component=broadcast-groups,name="<broadcastgroupName>"
or the resource namebroadcastgroup.<the broadcast group name>
). Broadcast groups parameters can be retrieved using theBroadcastGroupControl
attributes (see Clusters) -
Cluster connections
They can be started or stopped using the
start()
orstop()
method on theClusterConnectionControl
class (with the ObjectNameorg.apache.activemq.artemis:broker="<brokerName>",component=cluster-connections,name="<clusterconnectionName>"
or the resource nameclusterconnection.<the cluster connection name>
). Cluster connections parameters can be retrieved using theClusterConnectionControl
attributes (see Clusters)
Using Management Via JMX
Apache ActiveMQ Artemis can be managed using JMX.
The management API is exposed by Apache ActiveMQ Artemis using MBeans interfaces.
Apache ActiveMQ Artemis registers its resources with the domain org.apache.activemq.artemis
.
For example, the ObjectName
to manage the anycast queue exampleQueue
on the address exampleAddress
is:
org.apache.activemq.artemis:broker=<brokerName>,component=addresses,address="exampleAddress",subcomponent=queues,routing-type="anycast",queue="exampleQueue"
and the MBean is:
org.apache.activemq.artemis.api.core.management.QueueControl
The MBean's ObjectName
are built using the helper class
org.apache.activemq.artemis.api.core.management.ObjectNameBuilder
. You can
also use jconsole
to find the ObjectName
of the MBeans you want to
manage.
Managing Apache ActiveMQ Artemis 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 Apache ActiveMQ Artemis. It can be disabled by
setting jmx-management-enabled
to false
in
broker.xml
:
<!-- false to disable JMX management for Apache ActiveMQ Artemis -->
<jmx-management-enabled>false</jmx-management-enabled>
If JMX is enabled, Apache ActiveMQ Artemis 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 to configure the server for remote management (system properties must be set in
artemis.profile
).
By default, Apache ActiveMQ Artemis server uses the JMX domain "org.apache.activemq.artemis".
To manage several Apache ActiveMQ Artemis servers from the same MBeanServer, the JMX
domain can be configured for each individual Apache ActiveMQ Artemis server by setting
jmx-domain
in broker.xml
:
<!-- use a specific JMX domain for ActiveMQ Artemis MBeans -->
<jmx-domain>my.org.apache.activemq</jmx-domain>
MBeanServer configuration
When Apache ActiveMQ Artemis is run in standalone, it uses the Java Virtual Machine's
Platform MBeanServer
to register its MBeans. By default Jolokia
is also deployed to allow access to the mbean server via rest.
Example
See the chapters chapter for an example which shows how to use a remote connection to JMX and MBean proxies to manage Apache ActiveMQ Artemis.
Exposing JMX using Jolokia
The default Broker configuration ships with the Jolokia http agent deployed as a Web Application. Jolokia is a remote JMX over HTTP bridge that exposed mBeans, for a full guids as to how to use refer to Jolokia Documentation, however a simple example to query the broker's version would be to use a browser and go to the URL http://localhost:8161/jolokia/read/org.apache.activemq.artemis:broker="0.0.0.0"/Version.
This would give you back something like the following:
{"request":{"mbean":"org.apache.activemq.artemis:broker=\"0.0.0.0\"","attribute":"Version","type":"read"},"value":"2.0.0-SNAPSHOT","timestamp":1487017918,"status":200}
Using Management Via Apache ActiveMQ Artemis API
The management API in ActiveMQ Artemis is called by sending Core Client messages to a special address, the management address.
Management messages are regular Core Client 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,
Apache ActiveMQ Artemis 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
String rather than Java Serialization (the
org.apache.activemq.artemis.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:
-
Create a
ClientRequestor
to send messages to the management address and receive replies -
Create a
ClientMessage
-
Use the helper class
org.apache.activemq.artemis.api.core.management.ManagementHelper
to fill the message with the management properties -
Send the message using the
ClientRequestor
-
Use the helper class
org.apache.activemq.artemis.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, "activemq.management");
ClientMessage message = session.createMessage(false);
ManagementHelper.putAttribute(message, "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.artemis.api.core.management.ResourceNames
and are
straightforward (e.g. queue.exampleQueue
for the Core Queue
exampleQueue
.
Configuring Management
The management address to send management messages is configured in
broker.xml
:
<management-address>activemq.management</management-address>
By default, the address is activemq.management
.
The management address requires a special user permission manage
to
be able to receive and handle management messages. This is also
configured in broker.xml:
<!-- users with the admin role will be allowed to manage -->
<!-- Apache ActiveMQ Artemis using management messages -->
<security-setting match="activemq.management">
<permission type="manage" roles="admin" />
</security-setting>
Example
See the examples chapter for an example which shows how to use JMS messages to manage the Apache ActiveMQ Artemis server.
Management Notifications
Apache ActiveMQ Artemis 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 Configuring JMX section), JMX notifications can be received by
subscribing to org.apache.activemq.artemis:type=Broker,brokerName=<broker name>,module=Core,serviceType=Server
for
notifications on resources.
Core Messages Notifications
Apache ActiveMQ Artemis 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 broker.xml
:
<management-notification-address>activemq.notifications</management-notification-address>
By default, the address is activemq.notifications
.
JMS Messages Notifications
Apache ActiveMQ Artemis's notifications can also be received using JMS messages.
It is similar to receiving notifications using Core API:
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 the examples chapter for an example which shows how to use a JMS MessageListener
to receive management notifications from ActiveMQ Artemis 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
_AMQ_NotifType
(value noted in parentheses) and _AMQ_NotifTimestamp
header. The timestamp is the un-formatted result of a call to
java.lang.System.currentTimeMillis()
.
-
BINDING_ADDED
(0)_AMQ_Binding_Type
,_AMQ_Address
,_AMQ_ClusterName
,_AMQ_RoutingName
,_AMQ_Binding_ID
,_AMQ_Distance
,_AMQ_FilterString
-
BINDING_REMOVED
(1)_AMQ_Address
,_AMQ_ClusterName
,_AMQ_RoutingName
,_AMQ_Binding_ID
,_AMQ_Distance
,_AMQ_FilterString
-
CONSUMER_CREATED
(2)_AMQ_Address
,_AMQ_ClusterName
,_AMQ_RoutingName
,_AMQ_Distance
,_AMQ_ConsumerCount
,_AMQ_User
,_AMQ_RemoteAddress
,_AMQ_SessionName
,_AMQ_FilterString
-
CONSUMER_CLOSED
(3)_AMQ_Address
,_AMQ_ClusterName
,_AMQ_RoutingName
,_AMQ_Distance
,_AMQ_ConsumerCount
,_AMQ_User
,_AMQ_RemoteAddress
,_AMQ_SessionName
,_AMQ_FilterString
-
SECURITY_AUTHENTICATION_VIOLATION
(6)_AMQ_User
-
SECURITY_PERMISSION_VIOLATION
(7)_AMQ_Address
,_AMQ_CheckType
,_AMQ_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
,_AMQ_Binding_Type
,_AMQ_Address
,_AMQ_Distance
-
PROPOSAL_RESPONSE
(19)_JBM_ProposalGroupId
,_JBM_ProposalValue
,_JBM_ProposalAltValue
,_AMQ_Binding_Type
,_AMQ_Address
,_AMQ_Distance
-
CONSUMER_SLOW
(21)_AMQ_Address
,_AMQ_ConsumerCount
,_AMQ_RemoteAddress
,_AMQ_ConnectionName
,_AMQ_ConsumerName
,_AMQ_SessionName
Message Counters
Message counters can be used to obtain information on queues over time as Apache ActiveMQ Artemis 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
broker.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
broker.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 queue using JMX:
// retrieve a connection to Apache ActiveMQ Artemis's MBeanServer
MBeanServerConnection mbsc = ...
QueueControlMBean queueControl = (QueueControl)MBeanServerInvocationHandler.newProxyInstance(mbsc,
on,
QueueControl.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 the examples chapter for an example which shows how to use message counters to retrieve information on a JMS Queue
.