我使用cpp_redis创建了两个应用程序;一个使用发布和另一个订阅者。我已经将redis客户端包装到了一个类中,因为我希望能够在将来更改通信。我遇到的问题是我的类的回调在使用条件变量时不起作用。使用redis-cli监视器,我可以看到事件正在发布但订阅者应用程序没有收到。如果我更改代码以使用原子变量并替换主循环中的条件变量并添加 while(!atomic_var)以等待; ,则订阅回调有效。
class EventComms : public IEventComms
{
public:
EventComms(cpp_redis::client &client, string channel);
~EventComms();
void Publish(string uid);
void Subscribe(TSubCallbackFunction callback);
private:
string comms_channel;
cpp_redis::client &redis_client;
cpp_redis::subscriber sub;
};
void EventComms::Subscribe(TSubCallbackFunction callback) {
sub.connect();
sub.subscribe(comms_channel,
[&](const string& channel, const string& message){
if (comms_channel == channel) {
callback(message);
}
});
sub.commit();
}
我的发布代码。
int main(int argc, char* argv[]) {
cpp_redis::client client;
client.connect();
EventComms *comms = new EventComms(client, "/TEST");
char c;
while (1) {
cout << "Waiting for commands " << endl;
c = getchar();
switch (c) {
case 'p':
{
string uuid = generateUuidString();
comms->Publish(uuid);
break;
}
default:
break;
}
}
return 0;
}
我的订阅代码。
int main(int argc, char *argv[]) {
std::condition_variable cv;
cpp_redis::client client;
client.connect();
EventComms comms(client, "/TEST");
comms.Subscribe([&](string message) {
event_id = message;
cout << "rx message: " << message << endl;
waitcv.notify_all();
}
);;
cout << "started software" << endl;
while(1) {
std::mutex mutex;
std::unique_lock<std::mutex> lock(mutex);
waitcv.wait(lock);
cout << "Received data: " << event_id << endl;
}
return 0;
}
答案 0 :(得分:0)
不确定此处是否不完整,但是 https://cylix.github.io/cpp_redis/html/classcpp__redis_1_1subscriber.html#ab7feafca57399394e3a1a0d6daf52770
他们说: cpp_redis :: subscriber用于与Redis服务器进行PUB / SUB通信。请不要使用cpp_redis :: client以以下方式订阅一些Redis频道:
希望这会有所帮助。 (我本人仍在与PUB / SUB斗争,所以我没有解决方案)