只有当我订阅主题时,我才会失去信息。
下面是一个场景:
订阅者订阅特定的主题,然后在不同线程中调用发布服务器(具有相同的上下文和相同的“订阅主题”)。
发布者接收“订阅的主题”并发布它。
当我运行两个过程(意味着两个订阅线程和两个发布者线程)时,我只在其中一个线程上接收到一条消息(随机)。
我不知道为什么我会失去第二条信息。
发布线程:
void *publisher = zmq_socket(ptStruct->zContext, ZMQ_PUB);
assert(0 == zmq_bind(publisher, "inproc://#1"));
printf("Publishes to %d \n", ptStruct->iID);
assert(-1 != zmq_send(publisher, &(ptStruct->iID), sizeof(ptStruct->iID), 0));
zmq_close(publisher);订阅线程:
void *subscriber = zmq_socket(ptStruct->zContext, ZMQ_SUB);
assert(0 == zmq_connect(subscriber, "inproc://#1"));
assert(0 == zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, &(ptStruct->iID), sizeof(ptStruct->iID)));
printf("Subscribed to %d \n", ptStruct->iID);
/* Now run the publisher in a different thread */
OSTHREAD_CreateThread(&ptThread, publishThread, ptStruct, NULL);
assert(-1 != zmq_recv(subscriber, acRec, 255, 0));
printf("Got %d \n", acRec[0]);
zmq_close(subscriber);我运行了两次订阅线程,这是输出:
Subscribed to 1
Subscribed to 2
Publishes to 1
Got 1
Publishes to 2发布于 2017-02-22 21:50:09
您正在创建两个不同的发布者,它们是bind()-ing到同一个inproc端点"#1“--一个端点只能绑定一次,第二个发布者在同一个端点上的bind()失败,然后不发送消息。
此外,您可能希望在publisher bind()-ing和send()-ing之间添加一些延迟,这是由于慢速接缝机问题--发布者可能会尝试在发布服务器和订阅服务器完成连接之前发送、然后删除您的消息,这也会导致您丢失消息。
https://stackoverflow.com/questions/42399217
复制相似问题