2017-02-22 40 views
3

Я теряю сообщения только тогда, когда я подписываюсь на темы.ZeroMQ Pub/Sub отбрасывает сообщения только при подписке на темы

Вот сценарий:
Абонент подписывается на конкретную тему, а затем вызывает издателя в другом потоке (с тем же контекстом и той же «подпиской»).
Издатель получает «подписанную тему» ​​и публикует его.

Когда я запускаю две процедуры (что означает 2 потоки подписчиков и 2 потока издателя), я получаю только одно сообщение на одном из потоков (случайным образом).
Я понятия не имею, почему я теряю второе сообщение.

Издатель Тема: Тема

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); 

Subscriber:

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 

ответ

1

Вы создаете два разных издателей то есть bind() -вход к тому же inproc конечная точка "# 1" - конечная точка может быть привязана только один раз, второй издатель не выполняет bind() на той же конечной точке, а затем не отправляет сообщение.

Кроме того, вы, вероятно, хотите добавить некоторую задержку между издателем bind() -ing, а затем send() -ную первое сообщение, в связи с slow joiner проблемы - издатель может попытаться отправить, а затем падение, Ваше сообщение до того, как издатель и абонент завершат соединение, что также приведет к потере вашего сообщения.

+0

Интересно .. Хотя это сработало, когда я не использовал фильтры в подписке. Считаете ли вы, что есть лучший способ сделать это, чем pub/sub? (потому что мне нужно что-то вроде pub/sub, но многих для многих) – Drxxd

+0

Вы не даете достаточно подробностей, чтобы действительно понять, как лучше всего разработать ваше общение. Вы можете сделать много для многих с pub/sub, вам просто нужно привязать каждый паб к своей конечной точке, а затем подключить каждого абонента к каждому пабу. Но зачем вам больше одного паб-палочки? Не понимая, что вы пытаетесь сделать, я не могу предложить, что может быть лучше в вашем случае. – Jason