Version 0.1.5
A simple test/benchmark utility for Apache message brokers.
amqutil is a simple Java command-line utility for testing
and exercising Apache (and other) JMS message brokers. It works with the
Apache ActiveMQ and Artemis brokers,
and also with Red Hat productized equivalents, A-MQ 6 and AMQ 7.
Since
adding support for Apache Qpid (in version 0.1.2), amqutil can also work
with any message broker or router that supports AMQP 1.x,
like qdrouterd. For Artemis-based
brokers, amqutil can use the OpenWire or native Artemis
wire protocols. The native Artemis protocol can be used to exercise
the message broker built into recent versions of Wildfly (and JBoss
EAP).
amqutil can put messages onto queues or
topics,
consume from queues, set message header properties,
subscribe to topics, list queue contents,
and dump individual messages in various formats.
Messages can be read from and written to text files, or just generated
internally by the utility. amqutil supports transacted
batches, durable subscriptions, inter-message delays, and persistent
and non-persistent production. It supports various acknowledgement modes.
amqutil was originally intended to extend the
test client functionality
provided by the mq-client.jar utility that was
supplied with ActiveMQ, and so its command-line is similar (but not identical)
to that utility's command line. However, amqutil now
supports many brokers, and
provides a number of features that
mq-client.jar never did, particularly around queue and
broker browsing, and message formatting.
amqutil is supplied as a Java JAR file that embeds the ActiveMQ,
Qpid, and Artemis client runtimes, so installation consists of
building the application using Maven and copying the output JAR file
to any convenient directory.
amqutil is supplied as a Java JAR file (see the Downloads
section), and should be invoked like this:
java -jar /path/to/amqutil.jar [command] {options}
However, throughout this document the command amqutil is used
as an abbreviation for this longer command line. Of course,
it should be possible
to create a script or batch file that allows amqutil to be
invoked this way (and a sample is included in the source code bundle).
Please note that the default wire protocol is OpenWire. You can change
this using the --qpid or --artemis options.
amqutil browse --host mybroker --port 6161 --destination testqueue List messages on destination testqueue, on broker mybroker:6161 Note that --url can be used instead of --host and --port amqutil browse --user fred --password secret --destination testqueue List messages on destination testqueue, on default broker localhost:6161, using specific connection credentials amqutil list List the destinations on the default broker amqutil show 23 --destination testqueue Print to the console details of message 23 on destination testqueue, without consuming the message amqutil produce 1000 --destination testqueue --batch 10 Produce 1000 arbitrary 500-character text messages to testqueue in transacted batches of 10 messages amqutil produce 1000 --destination testqueue Produce 1000 arbitrary 500-character text messages to testqueue amqutil produce --destination testqueue --length 42 Produce a single arbitrary text message of length 42 characters to testqueue amqutil --produce --destination testqueue --file data.txt Produce text file data.txt to testqueue amqutil consume --destination testqueue --format long Consume from the head of testqueue and display all message headers amqutil consume --destination testqueue --sleep 1000 Consume from the head of testqueue and display the message ID only, pausing for 1000 msec after each message amqutil consume --destination testqueue --number 1000 --format none --times Time how long it takes to consume 1000 messages from testqueue amqutil subscribe --destination testtopic --format long Subscribe to testtopic and display one message in long format when it is published amqutil publish --destination testtopic --file topic.txt Publish the text in topic.txt to testtopic amqutil subscribe --destination testtopic --durable my-client Create a durable subscription with client ID my-client amqutil count --destination testtopic Count the messages on the specified destinatioN amqutil help subscribe Get detailed usage for the subscribe command
You will need the compiled binary JAR file (see the Downloads section below) and a recent Java JVM (Java 7 or later.) To run the utility, install the JAR in any convenient directory, and then:
java -jar /path/to/amqutil.jar {options}
To build amqutil, obtain and
unpack the source code bundle, and then
mvn compile assembly:single
or
mvn package
This will create a JAR file in the target directory, which
contains the amqutil code and all the necessary ActiveMQ client
support. To run the utility, no other dependencies should be necessary;
just use java -jar:
java -jar target/amqutil-0.0.1-jar-with-dependencies.jar {options}
For Linux users, a script install_linux.sh is provided
that will copy
the compiled JAR to /usr/share/amqutil and
create an executable script
/usr/bin/amqutil to run it. Thereafter, you should be able to run
simply:
$ amqutil {options}
Note that Maven will automatically download all the dependencies needed to
build amqutil -- about 20Mb of them. This might take some
time on the first build.
amqutil is configured to use specific versions of
the various client libraries it supports. These can be changed
by
modifying the versions in
pom.xml: the values to be changd should be self-explanatory.
The latest version of the source can be obtained from github.
All amqutil invocations takes the following form:
amqutil [command] {options}
The command is mandatory, and specifies the mode of
operation. Further options depend on the command. In all cases, a
brief description of the available options can be obtained thus:
amqutil [command] --help
To find out how to get more general information, just run
amqutil help
The commands (modes of operation) available to amqutil are
a follows.
amqutil browse
Display a list of messages on the destination whose name is
given by the --destination option. To see individual
message contents, use show, passing the index of the
message from the output of browse.
amqutil commands
Show a list of available commands.
amqutil consume {number} {--destination queue} {...}
Consume number messages from the queue destination whose
name is given by the
--destination option. If the number is omitted, one message
will be consumed.
The format of the displayed
messages is controlled using the --format option; to write
consumed text messages to a text file, using --file.
If asked to consume more
messages than are waiting on the destination, amqutil will
block until new messages are available.
amqutil count {--destination queue} {...}
Displays the number of messages currently waiting on the specified destination.
amqutil helpDisplay a summary of command-line options.
amqutil listList the destinations on the message broker.
amqutil manualDump the whole manual (this file) to standard output in plain text format, formatted for 80 character width.
amqutil produce {number} {--destination queue} {...}
Produce number messages to the queue destination whose name
is given by the
--destination option. By default, one message is produced.
To pproduce messages from a text file, use --file; otherwise
a message of --length characters is generated internally.
amqutil publish {number} {--destination topic} {...}
Publish number messages to the topic destination whose
name is given by the
--destination option. By default, one message is published.
To publish messages from a text file, use --file; otherwise
a message of --length characters is generated internally.
amqutil show {message_index} {--destination queue} {...}
Displays in detail the message whose index is given by
message_index,
on the queue whose name is given by --destination.
The indices are arbitrary, and correspond to the numbers displayed when
using the browse command. However, message zero is always
the head of the queue, that is, the message that will be consumed next.
If the message is a text message, its contents will be displayed. Note
that it isn't an error to use this option with a topic, but no messages
will ever be shown.
amqutil subscribe {number} {--destination queue} {--durable ID} {...}
Subscribe to the topic destination whose name is given by the
--destination option. This operation blocks until
number messages are published to the topic.
If no number is given, wait for one message.
The message read may be displayed, according to
the --format option.
The --durable switch creates a durable subscription with
the specific client ID on the connection. The subscription name is
"amqutil", which cannot be changed. The --shared switch
creates a shared subscription, as defined in the JMS 2.0 specification.
This can be combined with --durable if required. Note that
shared subscription support is only available for wire protocols that
are compatible with JMS 2.0; in other cases an exception will be
thrown.
amqutil versionShow program version.
Not all command-line options are relevant to a specific command, although
--host,
--port,
--url,
--qpid,
--artemis,
--user, and
--password are generally applicable. To see which switches are
applicable to a specific command, use amqutil [command] --help.
a,--artemis
Use the native Artemis wire protocol
--batch {size}
Produce or consume messages in transacted batches of the specified
size. Use --batch 1 to use a transacted session without
batching.
-d, --destination {destination_name}
Specifies the queue or topic name for most other operations. If no name
is given, the default is "__test_queue".
--durable {client-ID}
Used in conjunction with amqutil subscribe, makes subscriptions
durable with the specified client ID.
--file {filename}
When publishing or producing messages, read the (text) message body from
the specified file, rather than generating it internally. The whole file
is read or written, and any --length option is ignored.
This option reads and writes using the platform's default character
encoding (usually UTF-8 on Linux systems), even though this may not be
the encoding format used within the JMS broker itself.
--format {none|short|long|text}
Format for messages that are consumed with consume,
subscribe or
show.
none is useful for
benchmarking, because console output is often slower than messaging operations.
short displays only the message ID and type; long
displays all headers; text displays all headers and also the
message body, if it is text.
--host {hostname}
The hostname or IP of the broker; defaults to localhost.
--jmstype {string}
Set the value of the JMSType header.
--length {number}
When generating messages internally, use the specified number of characters.
Note that the number of bytes actually stored will depend on the character
encoding used by the JVM and/or the JMS broker, and will typically be
larger (rarely smaller) than the given number of characters.
--loglevel {error|warn|info|debug}
Sets the logging level, both of this utility and the ActiveMQ client.
In practice, although all these levels are defined, the only ones that
the ActiveMQ client uses are 'error' and 'debug.' The default is
'error,' which means silent operation in normal circumstances.
--linger {msec}
In batch mode (see --batch), delay for the specified time between
receiving the batch, and acknowledging it. The batch size can be usefully be 1.
This switch simulates an 'abnormal' condition, where the consumer takes a substantial
time to acknowledge a message.
--nonpersistent
Enable non-persistent delivery, when used with produce
or publish.
-p. --password {password}
Specifies the password for authentication against the AMQ broker.
Default 'admin'.
--percent
Prints percentage completion as an operation is performed; this can be useful
when dealing with huge numbers of messages.
--port {number}
Broker's TCP/IP port number; default 61616
--properties {name=value[,name=value]...}
Sets arbitrary string properties to the message header before sending.
Properties are specified as name1=value1,name2=value2....
-q,--qpid
Use the Apache Qpid JMS client to support the AMQP 1.0 protocol.
--sleep {msec}
Sleep (wait) for the specified number of milliseconds after dispatching or
consuming each message. See also --linger.
--selector {expression}
When consuming messages from a queue, apply the specified selector expression
--time
Show the time in milliseconds taken to complete whatever operation
was specified.
--ttl {msec}
When producing a message to a queue, set the expiration time to the specified
time.
-u, --user {username}
Username for authentication on the broker. Default 'admin'.
--url {broker_url}
Use a URL for connection to the broker, rather than a simple host/port
combination. This will be necessary if you want to work with multiple
brokers in a failover group. An example might be
--url failover:\(tcp://broker1:61616,tcp://broker2:61616\).
Note that the parentheses have to be escaped here to protect them from
the shell. If --url is specified, then --host and
--port are ignored.
When listing queue contents with browse, the first entry
shown is the head of
the queue, that is, the message that would next be consumed.
When displaying messages without consuming them using show,
the numeric argument specifies the position in the queue, with zero
being the head.
browse, show, and count all
rely on the JMS queue browsing API. ActiveMQ can be configured such
such case, amqutil will not have access to all the messages
on a destination.
When producing a message to a destination, if no message file
(--file) is
provided, then a string of 500 arbitrary characters will be produced,
or of length set by the --length switch.
When listing queue contents with --browse, no guarantee
can be given that the queue contents will not change before the next
operation.
When producing a message from a text file, the file is read in the platform's default character encoding.
It is not actually an error to use the --browse option on
a topic, but no messages will ever be shown -- that is a consequence of
the way that publish/subscribe messaging works.
When the --consume option is used, and it blocks because there
are insufficient messages to consume, then the only way to stop the
program is to kill it (e.g., ctrl+C). If the --batch mode
is used, and the session is therefore transacted, any messages
consumed will be returned to the destination. This is not a bug although
it can be confusing -- transacted sessions are designed to work that way.
Message delivery is persistent by default. To test non-persistent
delivery, use the --nonpersistent switch.
ActiveMQ supports multi-destination production and consumption. To use
this feature with amqutil, separate the multiple destinations
with commas. For example: --destination d1,d2,d3.
amqutil can monitor broker operation via
advisory topics.
For example, to monitor connections being opened and closed in real time:
amqutil --subscribe --destination ActiveMQ.Advisory.Connection
However, most advisory topics are not enabled by default, and some administrators are wary of enabling them, because of the additional network and memory load they might create.
The --properties switch can be used to exercise some specific
ActiveMQ behavior. For example, setting the JMSXGroupID header
should ensure that a single consumer gets all the messages, regardless
of the number of consumers attached.
amqutil --properties JMSXGroupID=something --produce ...
amqutil is really only useful for
sending and receiving text messages; JMS does support other formats, of
course, but
their contents are typically only meaningful to specific the applications
the use them. However, the utility can also work with bytes messages --
and these are usually quicker to generate when they need to be large.
The utility was developed and tested using Sun/Oracle JDK 1.7. Although it uses no specific Java 7 language features or APIs, there are many dependent libraries and drivers, and these may not work with earlier Java versions.
Apache Artemis supports the OpenWire protocol that was developed for ActiveMQ,
so the same client runtime (from ActiveMQ) can be used for both brokers.
Howeve, ActiveMQ-specific features of OpenWire, such as the ability to
list destinations on the broker, may not be supported by Artemis.
The same limitation applies to the AMQP protocol: not every command
provided by amqutil will work with an AMQP-based broker.
At present, amqutil is Enlish-language only.
| 0.1.5, September 2022 | Added JMS 2.0 shared subscription support |
| 0.1.4, February 2020 | Added Artemis support. Fixed broken manual command. |
| 0.1.3, September 2018 | Added "textonly" format |
| 0.1.2, January 2018 | Preliminary AMQP support using Apache Qpid |
| 0.1.0, March 2015 | Re-written so that command-line arguments are specified differently for each sub-command, reducing the chance of the user providing arguments that have no effect. |
| 0.0.1 | First functional release |
amqutil is mainted by Kevin Boone (kevin at railwayterrace dot com). It is distributed under the terms of the GNU Public License, version :.0,
in the hope that it will be useful. However, there is no warranty of any kind.
Please report bugs through GitHub.