SimpleAmqpClient is an easy-to-use C++ wrapper around the rabbitmq-c C library. It derives inspiration from the puka AMQP library in that it abstracts away the underlying AMQP wire concept of channels and uses them as an error/consumer scope. This should make writing simple single-threaded AMQP-enabled apps easy.
Known to work in the following environments:
This is a typical cmake project, it should work like most typical cmake projects:
In a sibling directory to where you extracted the source code:
mkdir simpleamqpclient-build
cd simpleamqpclient-build
cmake ..
Then use your the appropriate build utility to build the library (make, msbuild)
Interesting targets
CMAKE_INSTALL_PREFIX
is defined toNotes:
-DENABLE_TESTING=ON
to
cmakeBoost libraries are needed, so you can install them using nuget:
nuget install boost_chrono-vc142 -Version 1.77.0
nuget install boost_system-vc142 -Version 1.77.0
nuget install boost -Version 1.77.0
To build and install succesfully, rabbitmq-c should be built as shared library.
Let boost_chrono and boost_system be in same directory C:\boost
, rabbitmq-c be on C:\rabbitmq-c
,
SSL be OFF, and VS2019 is used, than CMake CLI is:
cd cmake -G "Visual Studio 16" -A x64 -DBoost_INCLUDE_DIR="C:/boost.XX.XX.X.X/lib/native/include" -DBOOST_ROOT="C:/boost.X.XX.X.X" -DBOOST_LIBRARYDIR="C:/boost" -DRabbitmqc_INCLUDE_DIR="C:/rabbitmq-c/include" -DRabbitmqc_LIBRARY="C:/rabbitmq-c/lib/rabbitmq.4.lib" -DBoost_USE_STATIC_LIBS=ON -DBUILD_STATIC_LIBS=ON -DENABLE_SSL_SUPPORT=OFF ..
#include <SimpleAmqpClient/SimpleAmqpClient.h>
Will include all the headers necessary to use the library. The corresponding library is SimpleAmqpClient
The main interface to the library is the AmqpClient::Channel class. It represents a connection to an AMQP broker, the connection is established on construction of an instance of this class.
AmqpClient::Channel::ptr_t connection = AmqpClient::Channel::Create("localhost");
All classes have a typedef ptr_t which is equivalent to boost::shared_ptr<> of the containing class. All classes also have a Create() method does the job creating a new ptr_t using boost::make_shared<>(). It is recommended that you use these methods to construct objects in the library.
Commands dealing with declaring/binding/unbinding/deleting exchanges and queues are all done with the above AmqpClient::Channel object. If one of these commands fails to complete a AmqpClient::ChannelException will be thrown, which can be caught and the AmqpClient::Channel object is still useable. If a more severe error occurs a AmqpClient::ConnectionException or AmqpClient::AmqpResponseLibraryException maybe thrown, in which case the Channel object is no longer in a usable state and further use will only generate more exceptions.
Consuming messages is done by setting up a consumer using the BasicConsume method. This method returns a consumer tag that should be used with the BasicConsumeMessage BasicQos, BasicRecover, and BasicCancel.
std::string consumer_tag = channel->BasicConsume("my_queue", "");
Envelope::ptr_t envelope = channel->BasicConsumeMessage(consumer_tag);
// Alternatively:
Envelope::ptr_t envelope;
channel->BasicConsumeMessage(consumer_tag, envelope, 10); // 10 ms timeout
// To ack:
channel->BasicAck(envelope);
// To cancel:
channel->BasicCancel(consumer_tag);