Getting started
.NET ActiveMQ Artemis Client is a lightweight library built on top of AmqpNetLite. The main goal of this project is to provide a simple API that allows fully leverage Apache ActiveMQ Artemis capabilities in .NET World.
Installation
.NET ActiveMQ Artemis Client is distributed via NuGet. You can add ActiveMQ.Artemis.Client NuGet package using dotnet CLI:
dotnet add package ArtemisNetClient
API overview
The API interfaces and classes are defined in the ActiveMQ.Artemis.Client
namespace:
using ActiveMQ.Artemis.Client;
The core API interfaces and classes are:
IConnection
: represents AMQP 1.0 connectionConnectionFactory
: constructs IConnection instancesIConsumer
: represents a message consumerIProducer
: represents a message producer attached to a specified addressIAnonymousProducer
: represents a message producer capable of sending messages to multiple addresses
Creating a connection
Before any message can be sent or received, a connection to the broker endpoint has to be opened. The AMQP endpoint where the client connects is represented as an Endpoint
object. The Endpoint
object can be created using the factory method Create
that accepts individual parameters specifying different parts of the Uri.
Endpoint.Create(
host: "localhost",
port: 5672,
user: "guest",
password: "guest",
scheme: Scheme.Amqp);
host
and theport
parameters define TCP endpoint.user
andpassword
parameters determine if authentication (AMQP SASL) should be performed after the transport is established. Whenuser
andpassword
are absent, the library skips SASL negotiation altogether.scheme
parameter defines if a secure channel (TLS/SSL) should be established.
To open a connection to an ActiveMQ Artemis node, first instantiate a ConnectionFactory
object. ConnectionFactory
provides an asynchronous connection creation method that accepts Endpoint
object.
The following snippet connects to an ActiveMQ Artemis node on localhost
on port 5672
as a guest
user using guest
as a password via the insecure channel (AMQP).
var connectionFactory = new ConnectionFactory();
var endpoint = Endpoint.Create("localhost", 5672, "guest", "guest");
var connection = await connectionFactory.CreateAsync(endpoint);
Disconnecting
Closing connection, the same as opening, is a fully asynchronous operation.
To disconnect, simply call DisposeAsync
on connection object:
await connection.DisposeAsync();
Connections, producers, and consumers are meant to be long-lived objects. The underlying protocol is designed and optimized for long-running connections. That means that opening a new connection per operation, e.g. sending a message, is unnecessary and strongly discouraged as it will introduce a lot of network round trips and overhead. The same rule applies to all client resources.
Sending messages
The client uses IProducer
and IAnonymousProducer
interfaces for sending messages. To to create an instance of IProducer
you need to specify an address name and a routing type to which messages will be sent.
var producer = await connection.CreateProducerAsync("a1", RoutingType.Anycast);
All messages sent using this producer will be automatically routed to address a1
using Anycast
routing type:
await producer.SendAsync(new Message("foo"));
To send messages to other addresses you can create more producers or use IAnonymousProducer
interface. IAnonymousProducer
is not connected to any particular address.
var anonymousProducer = await connection.CreateAnonymousProducer();
Each time you want to send a message, you need to specify the address name and the routing type:
await anonymousProducer.SendAsync("a2", RoutingType.Multicast, new Message("foo"));
Receiving messages
The client uses IConsumer
interface for receiving messages. IConsumer
can be created as follows:
var consumer = await connection.CreateConsumerAsync("a1", RoutingType.Anycast);
As soon as the subscription is set up, the messages will be delivered automatically as they arrive, and then buffered inside consumer object. The number of buffered messages can be controlled by Consumer Credit
. In order to get a message, simply call ReceiveAsync
on IConsumer
.
var message = await consumer.ReceiveAsync();
If there are no messages buffered ReceiveAsync
will asynchronously wait and return as soon as the new message appears on the client.
This operation can potentially last an indefinite amount of time (if there are no messages), therefore ReceiveAsync
accepts CancellationToken
that can be used to communicate a request for cancellation.
var cts = new CancellationTokenSource();
var message = await consumer.ReceiveAsync(cts.Token);
This may be particularly useful when you want to shut down your application.