https://activemq.apache.org/components/artemis/documentation/latest/core.html#core-api
Greetings... While reading this section, I believe a few reformulated paragraphs might be beneficial, as well as some grammatic improvement. I'm pasting my suggestion below for consideration. Hope you find it meaningful. Thanks & regards, Ben Using Core API Apache ActiveMQ Artemis is a messaging system with its own core API. If you don't want to use JMS API or any of the other supported protocols, you can use the core API directly. The core API provides all the functionality of JMS but without much of the complexity. It also contains features that are not available in JMS. 1. Core Messaging Concepts The core messaging concepts are similar to those in JMS. However, in general, the core API is simpler. This is because the distinctions between queues, topics and subscriptions are absent in the Core API. We'll discuss each of the major core messaging concepts in turn. For details about the API, please consult Javadoc. Also please refer to the address model chapter for a high-level overview of these concepts as well as configuration details. 1.1. Message A message is a unit of data which is transmitted between clients and servers. A message has a body which is a buffer object with convenient methods for reading and writing data into it. A message has a set of properties which are key-value pairs. Each property key is a string and property values can be of type integer, long, short, byte, byte[], String, double, float or Boolean. A message has an address it is to be sent to. When the message arrives on the server it is routed to one or more queues that are bound to the address. The routing semantics (i.e. anycast or multicast) are determined by the "routing type" of the address and queue. If the queues are bound to a filter, the message will only be routed to the queue(s) the filter matches. An address may have many queues bound to it or none. There may also be entities other than queues (e.g. diverts) bound to an address. Messages can be either durable or non-durable. Durable messages in a durable queue will survive a server crash or restart. Non-durable messages will not survive a server crash or restart. (How about durable messages in a non-durable queue? Or non-durable messages in a durable queue?) Messages can be specified with a priority value between 0 and 9. 0 represents the lowest priority and 9 represents the highest. The broker will attempt to deliver higher priority messages before lower priority ones. A Message can be set with an optional expiry time. The broker will not deliver messages after its expiry time has been exceeded. A Message may carry an optional timestamp that represents the time the message was sent. Apache ActiveMQ Artemis also supports the sending/receiving of messages larger than what can fit in the available RAM. 2. Core API 2.1. ServerLocator Clients use ServerLocator instances to create a ClientSessionFactory instance. A ServerLocator instance is used to locate server and create connections to it. In JMS terms think of a ServerLocator in the same way you would a JMS Connection Factory. A ServerLocator instance is created with the ActiveMQClient factory class. 2.2. ClientSessionFactory A client uses a ClientSessionFactory instance to create a ClientSession instance. A ClientSessionFactory instance is basically the connection to a server. In JMS terms think of them as JMS Connections. A ClientSessionFactory instance is created using the ServerLocator class. 2.3. ClientSession A client uses a ClientSession to consume and produce messages and group them in transactions. A ClientSession instance can support both transactional and non transactional semantics and provide XAResource interface so messaging operations can be part of a JTA transaction. A ClientSession instance may contain both ClientConsumer and ClientProducer instances. A ClientSession instance can be registered with an optional SendAcknowledgementHandler. This allows your client code to be notified asynchronously when a message it transmitted has successfully reached the server. This feature guarantees that the message you sent reaches the server without having to block and wait for confirmation of delivery before sending the next message. Blocking on each message sent is costly since it requires a network round trip for each message. By not blocking but receive acknowledgements asynchronously you can create true end to end asynchronous systems which is not possible using the standard JMS API. For more information on this feature please see the section Guarantees of sends and commits. 2.3.1. Identifying your session for management and debugging Assigning IDs to your core sessions will be helpful with monitoring and debugging the cluster using the management console. ClientSession session; // ... session.addMetaData(ClientSession.JMS_SESSION_IDENTIFIER_PROPERTY, "jms-client-id"); session.addMetaData("jms-client-id", "my-session"); This session ID will appear in the Client ID column under the Connections, Consumers and Producers tabs. It is the same as setClientID in JMS. 2.4. ClientConsumer Clients use a ClientConsumer instance to consume messages from a queue. Core messaging supports both synchronous and asynchronous message consumption semantics. If a ClientConsumer instance is configured with an optional filter expression, it will only consume messages that match that expression. 2.5. ClientProducer To send messages, A Client creates a ClientProducer instance on ClientSession. A ClientProducer instance can specify an address to which all outgoing messages are routed. If no address is specified when the ClientProvider is created, it can be set at time of message transmission. Please note that ClientSession, ClientProducer and ClientConsumer instances are designed to be re-used. It's an anti-pattern to create new ClientSession, ClientProducer and ClientConsumer instances for each message you produce or consume. If you do this, your application performance will be poor. This is discussed further in the section on Performance Tuning. 3. A simple example of using Core This is a simple program that uses the core messaging API to send and receive a message. It takes two steps: 1. set up the producer to write a message to an address, and 2. create a queue for the consumer using anycast routing, create the consumer, and start it. ServerLocator locator = ActiveMQClient.createServerLocator("vm://0"); // In this simple example, one session is used for both producing and consuming ClientSessionFactory factory = locator.createClientSessionFactory(); ClientSession session = factory.createSession(); // A producer is associated with an address ... ClientProducer producer = session.createProducer("example"); ClientMessage message = session.createMessage(true); message.getBodyBuffer().writeString("Hello"); // We need a queue attached to the address ... session.createQueue("example", RoutingType.ANYCAST, "example", true); // And a consumer attached to the queue ... ClientConsumer consumer = session.createConsumer("example"); // Once we have a queue, we can send the message ... producer.send(message); // We need to start the session before we can -receive- messages ... session.start(); ClientMessage msgReceived = consumer.receive(); System.out.println("message = " + msgReceived.getBodyBuffer().readString()); session.close();