【问题标题】:Hiredis publisher only sending first message in a while loopHiredis 发布者仅在 while 循环中发送第一条消息
【发布时间】:2021-06-08 06:45:24
【问题描述】:

我对 Hiredis/Redis 很陌生,无法在一段时间循环中为 Pub/Sub 架构创建工作发布者。
我成功地创建了一个只触发一条消息的发布者,然后退出。但我试图让发布者定期发送消息。这是我的出版商:

#include <signal.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include <hiredis/hiredis.h>
#include <hiredis/async.h>
#include <hiredis/adapters/libevent.h>

using namespace std;

void pubCallback(redisAsyncContext *c, void *r, void *privdata) {

  redisReply *reply = (redisReply*)r;
  if (reply == NULL){
    cout<<"Response not recev"<<endl; 
    return;
  }
  cout<<"message published"<<endl;
  redisAsyncDisconnect(c);
}

int main(int argc, char* argv[])
{
    signal(SIGPIPE, SIG_IGN);
    struct event_base* base = event_base_new();
    int status;
    int i = 0;
    redisAsyncContext* _redisContext = redisAsyncConnect("172.17.0.2", 6379);

    if (_redisContext->err) {
        /* Let context leak for now... */
        cout<<"Error: "<< _redisContext->errstr<<endl;
        return 1;
    }
    redisLibeventAttach(_redisContext,base);

    while(1) {
        string command ("publish ");
        command.append("test_channel");
        command.append (" ");
        command.append(to_string(i));
        cout << command << endl;
        status = redisAsyncCommand(_redisContext, 
            pubCallback, 
            (char*)"pub", command.c_str()
        );
        event_base_dispatch(base);
        i+=1;
        usleep(1000000);
    }
}

对于这个发布者,只接收到第一条消息"0",随后的命令似乎被忽略了。
是否可以在 while 循环中创建发布者发布?我是否必须为每条消息创建新连接或断开/重新连接?

【问题讨论】:

    标签: redis libevent hiredis


    【解决方案1】:

    我已经成功了。
    首先pubCallback函数中的redisAsyncDisconnect禁止我的程序发送后续消息。此行需要删除。
    这导致了另一个问题,因为该程序在发布第一条消息后开始挂起。发生这种情况是因为事件循环将挂起等待新的事件分发。消息发布后,我需要一种方法来打破这种僵局。
    方法是在pubCallback中调用event_base_loopbreak。

    这是工作代码:

    #include <signal.h>
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    
    #include <hiredis/hiredis.h>
    #include <hiredis/async.h>
    #include <hiredis/adapters/libevent.h>
    
    using namespace std;
    
    void pubCallback(redisAsyncContext *c, void *r, void *privdata) {
    
      redisReply *reply = (redisReply*)r;
      if (reply == NULL){
        cout<<"Response not recev"<<endl; 
        return;
      }
      cout<<"message published"<<endl;
    
      redisLibeventEvents *e = (redisLibeventEvents*) c->ev.data;
      event_base_loopbreak(e->base);
    }
    
    void connectCallback(const redisAsyncContext *c, int status) {
        if (status != REDIS_OK) {
            printf("Error: %s\n", c->errstr);
            return;
        }
        printf("Connected...\n");
    }
    
    void disconnectCallback(const redisAsyncContext *c, int status) {
        if (status != REDIS_OK) {
            printf("Error: %s\n", c->errstr);
            return;
        }
        printf("Disconnected...\n");
    }
    
    int main(int argc, char* argv[])
    {
        signal(SIGPIPE, SIG_IGN);
        
        int status;
        int i = 0;
        
        redisAsyncContext* _redisContext = redisAsyncConnect("172.17.0.2", 6379);
        if (_redisContext->err) {
            /* Let context leak for now... */
            cout<<"Error: "<< _redisContext->errstr<<endl;
            return 1;
        }
        struct event_base* base = event_base_new();
    
        redisAsyncSetConnectCallback(_redisContext,connectCallback);
        redisAsyncSetDisconnectCallback(_redisContext,disconnectCallback);
        redisLibeventAttach(_redisContext,base);
    
        while(1) {
            string command ("publish ");
            command.append("test_channel");
            command.append (" ");
            command.append(to_string(i));
            cout << command << endl;
    
            status = redisAsyncCommand(_redisContext, 
                pubCallback, 
                (char*)"pub", command.c_str()
            );
    
            event_base_dispatch(base);
            i+=1;
            usleep(500000);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2020-04-23
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多