ZBLOG

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

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

  1. #include <iostream>
  2. #include <string>
  3. #include <hiredis/hiredis.h>
  4. class RedisListener {
  5. public:
  6. using CallbackFunc = void (*)(const std::string&);
  7. RedisListener(const std::string& host, int port, const std::string& queueName, CallbackFunc callback)
  8. : host_(host), port_(port), queueName_(queueName), callback_(callback) {}
  9. static void asyncCallback(redisAsyncContext* context, void* reply, void* data) {
  10. RedisListener* listener = static_cast<RedisListener*>(data);
  11. redisReply* message = static_cast<redisReply*>(reply);
  12. if (message->type == REDIS_REPLY_ARRAY && message->elements >= 3) {
  13. std::string receivedQueueName = message->element[1]->str;
  14. std::string data = message->element[2]->str;
  15. // 调用传入的回调函数进行处理
  16. listener->callback_(data);
  17. if (data == "quit") {
  18. // 接收到特定消息(例如"quit"),停止事件循环
  19. aeStop(static_cast<aeEventLoop*>(listener->loop_));
  20. }
  21. }
  22. }
  23. void listenToQueue() {
  24. context_ = redisAsyncConnect(host_.c_str(), port_); // 异步连接到Redis服务器
  25. if (context_ == nullptr || context_->err) {
  26. std::cerr << "Failed to connect to Redis: " << (context_ ? context_->errstr : "nullptr") << std::endl;
  27. return;
  28. }
  29. loop_ = aeCreateEventLoop(1024); // 创建事件循环
  30. // 设置回调函数和传递额外数据
  31. redisAsyncCommand(context_, asyncCallback, this, "SUBSCRIBE %s", queueName_.c_str());
  32. // 将异步连接添加到事件循环中
  33. redisAeAttach(loop_, context_);
  34. // 开始事件循环
  35. aeMain(loop_);
  36. aeDeleteEventLoop(loop_); // 销毁事件循环
  37. }
  38. private:
  39. std::string host_;
  40. int port_;
  41. std::string queueName_;
  42. CallbackFunc callback_;
  43. redisAsyncContext* context_;
  44. aeEventLoop* loop_;
  45. };
  46. // 示例回调函数,根据不同的需求进行处理
  47. void handleData(const std::string& data) {
  48. std::cout << "Received data: " << data << std::endl;
  49. // TODO: 根据需要进行相应处理逻辑
  50. }
  51. int main() {
  52. RedisListener listener("127.0.0.1", 6379, "queue1", handleData);
  53. listener.listenToQueue();
  54. return 0;
  55. }

通过将监听封装成类,并在构造函数中接收队列名和回调函数作为参数,可以实现一次创建连接并根据不同的回调函数进行不同的处理。你可以根据自己的业务需求修改示例代码,并添加必要的错误处理、优雅退出等逻辑。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?