下面是一个示例代码,将监听封装成类并接收类对象作为参数:
#include <iostream>
#include <string>
#include <hiredis/hiredis.h>
class RedisListener {
public:
using CallbackFunc = void (*)(const std::string&);
RedisListener(const std::string& host, int port, const std::string& queueName, CallbackFunc callback)
: host_(host), port_(port), queueName_(queueName), callback_(callback) {}
static void asyncCallback(redisAsyncContext* context, void* reply, void* data) {
RedisListener* listener = static_cast<RedisListener*>(data);
redisReply* message = static_cast<redisReply*>(reply);
if (message->type == REDIS_REPLY_ARRAY && message->elements >= 3) {
std::string receivedQueueName = message->element[1]->str;
std::string data = message->element[2]->str;
// 调用传入的回调函数进行处理
listener->callback_(data);
if (data == "quit") {
// 接收到特定消息(例如"quit"),停止事件循环
aeStop(static_cast<aeEventLoop*>(listener->loop_));
}
}
}
void listenToQueue() {
context_ = redisAsyncConnect(host_.c_str(), port_); // 异步连接到Redis服务器
if (context_ == nullptr || context_->err) {
std::cerr << "Failed to connect to Redis: " << (context_ ? context_->errstr : "nullptr") << std::endl;
return;
}
loop_ = aeCreateEventLoop(1024); // 创建事件循环
// 设置回调函数和传递额外数据
redisAsyncCommand(context_, asyncCallback, this, "SUBSCRIBE %s", queueName_.c_str());
// 将异步连接添加到事件循环中
redisAeAttach(loop_, context_);
// 开始事件循环
aeMain(loop_);
aeDeleteEventLoop(loop_); // 销毁事件循环
}
private:
std::string host_;
int port_;
std::string queueName_;
CallbackFunc callback_;
redisAsyncContext* context_;
aeEventLoop* loop_;
};
// 示例回调函数,根据不同的需求进行处理
void handleData(const std::string& data) {
std::cout << "Received data: " << data << std::endl;
// TODO: 根据需要进行相应处理逻辑
}
int main() {
RedisListener listener("127.0.0.1", 6379, "queue1", handleData);
listener.listenToQueue();
return 0;
}
通过将监听封装成类,并在构造函数中接收队列名和回调函数作为参数,可以实现一次创建连接并根据不同的回调函数进行不同的处理。你可以根据自己的业务需求修改示例代码,并添加必要的错误处理、优雅退出等逻辑。
内容由零声教学AI助手提供,问题来源于学员提问