在CentOS上配置C++消息队列,你可以选择多种消息队列系统,如RabbitMQ、ZeroMQ、ActiveMQ等。以下是使用RabbitMQ作为消息队列系统的一个基本指南:
更新系统包
sudo yum update -y
安装Erlang(RabbitMQ的依赖)
sudo yum install -y erlang
添加RabbitMQ仓库
sudo tee /etc/yum.repos.d/rabbitmq.repo <<EOF
[rabbitmq-server] name=RabbitMQ Repository baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch repo_gpgcheck=1 enabled=1 gpgcheck=1 gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey EOF
4. **安装RabbitMQ服务器**
```bash
sudo yum install -y rabbitmq-server
启动并启用RabbitMQ服务
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
配置RabbitMQ(可选)
sudo rabbitmq-plugins enable rabbitmq_management
sudo rabbitmqctl add_user your_username your_password
sudo rabbitmqctl set_permissions -p / your_username ".*" ".*" ".*"
sudo rabbitmqctl set_user_tags your_username administrator
安装RabbitMQ C++客户端库
你可以使用rabbitmq-c
库,这是一个轻量级的C语言客户端库。
sudo yum install -y epel-release
sudo yum install -y rabbitmq-c
编写C++代码
下面是一个简单的示例,展示如何使用rabbitmq-c
库发送和接收消息。
#include <amqp.h>
#include <amqp_tcp_socket.h>
#include <iostream>
#include <string>
void fail_on_error(amqp_rpc_reply_t x, const char *msg) {
if (x.reply_type == AMQP_RESPONSE_NORMAL) {
return;
}
std::cerr << msg << ": " << amqp_error_string2(x.library_error) << std::endl;
exit(1);
}
int main() {
amqp_connection_state_t conn = amqp_new_connection();
amqp_socket_t *socket = amqp_tcp_socket_new(conn);
fail_on_error(amqp_socket_open(socket, "localhost"), "Opening socket");
fail_on_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "your_username", "your_password"), "Logging in");
amqp_channel_open(conn, 1);
fail_on_error(amqp_get_rpc_reply(conn), "Opening channel");
std::string queue_name = "hello";
amqp_queue_declare_ok_t *queue_declare_ok = nullptr;
fail_on_error(amqp_queue_declare(conn, 1, amqp_cstring_bytes(queue_name.c_str()), 0, 1, 0, 0, amqp_empty_table), "Declaring a queue");
queue_declare_ok = amqp_get_rpc_reply(conn);
if (queue_declare_ok->message.queue == AMQP_NULL_BUFFER) {
std::cerr << "Could not declare a queue!" << std::endl;
exit(1);
}
std::string message = "Hello World!";
amqp_basic_publish(conn, 1, amqp_cstring_bytes(""), amqp_cstring_bytes(queue_name.c_str()), 0, 0, nullptr, amqp_cstring_bytes(message.c_str()));
amqp_rpc_reply_t reply = amqp_basic_consume(conn, 1, amqp_cstring_bytes(queue_name.c_str()), amqp_cstring_bytes(""), 0, 1, 0, amqp_empty_table);
fail_on_error(reply, "Registering a consumer");
while (true) {
amqp_envelope_t envelope;
amqp_maybe_release_buffers(conn);
reply = amqp_consume_message(conn, &envelope, nullptr, 0);
fail_on_error(reply, "Waiting for messages");
std::cout << "Received message: " << std::string((char *)envelope.message.body.bytes, envelope.message.body.len) << std::endl;
amqp_destroy_envelope(&envelope);
amqp_basic_ack(conn, 1, envelope.delivery_tag, 0);
}
amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);
amqp_connection_close(conn, AMQP_REPLY_SUCCESS);
amqp_destroy_connection(conn);
return 0;
}
编译C++代码
g++ -o rabbitmq_example rabbitmq_example.cpp -lrabbitmq
运行程序
./rabbitmq_example
这个示例展示了如何连接到RabbitMQ服务器,声明一个队列,发送一条消息,并接收消息。你可以根据需要扩展这个示例,添加更多的功能和错误处理。