Я вижу вашу точку зрения, документация в замешательстве. Вот простой тест на Java с использованием клиентского сокета DEALER
с poller (от asyncsrv). Сервер отправляет клиенту 3 сообщения. Клиент проверяет и выводит каждое полученное сообщение. Я добавил send()
в клиенте, чтобы проверить вашу теорию. Предполагая send()
Очищает голосующий, мы ожидаем, что клиент для вывода получения только одного сообщения:
Сервер
public static void main(String[] args) {
Context context = ZMQ.context(1);
ZMQ.Socket server = context.socket(ZMQ.ROUTER);
server.bind("tcp://*:5555");
server.sendMore("clientId");
server.send("msg1");
server.sendMore("clientId");
server.send("msg2");
server.sendMore("clientId");
server.send("msg3");
}
Client
public void run() {
socket = context.socket(ZMQ.DEALER);
socket.setIdentity("clientId".getBytes());
socket.connect("tcp://localhost:5555");
ZMQ.Poller poller = new ZMQ.Poller(1);
poller.register(socket, ZMQ.Poller.POLLIN);
while (true) {
poller.poll();
if (poller.pollin(0)) {
String msg = socket.recvStr(0);
System.out.println("Client got msg: " + msg);
socket.send("whatever", 0);
}
}
}
выходы. ..
Client got msg: msg1
Client got msg: msg2
Client got msg: msg3
На основании результатов, делая send()
не очищает Poller для socket
, и это должно быть понятно, почему. Мы настроили poller с POLLIN
, что означает, что poller прослушивает входящие сообщений на socket
. При выполнении socket.send()
он создает исходящие сообщения, на которых не работает прослушиватель.
Надеюсь, это поможет ...
Я как-то с вами, но вы можете уточнить, что именно вы спрашиваете? Не уверен, что вы подразумеваете под _Why нужно «использовать его (zmq_poll) перед выходом» или «обрабатывать все события после каждого вызова zmq_poll()»? _ – raffian
@raffian Я использую 'zmq_poll' для мониторинга ввода на два гнезда. И я также отправляю сообщения через один из этих двух сокетов. Это безопасно, если я делаю 'zmq_send()', прежде чем обрабатывать все входные сообщения в этом сокете? Я не хочу терять сообщения. – GuLearn
@raffian Предложения в двойных кавычках скопированы из документа API, который я упомянул – GuLearn