ZBLOG

怎么把监听封装成为类,让他接收一个类对象作为传入参数,从而可以一次创建链接,根据指定的回调函数不一样进行不同的处理

下面是一个示例代码,将监听封装成类并接收类对象作为参数:

#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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13995

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?