[zeromq-dev] ZMQ.Poller in Java: how to do timeout check for REQ/REP?
Igor 'Lo' (И.L.)
bombsiteunrested at gmail.com
Tue Sep 6 18:18:18 CEST 2011
Hi all.
I have ZMQ.REP socket sitting in some unstable C++ application, so
Java client (doing ZMQ.REQ) can occasionally hang on socket.recv(),
blocking the application.
What I want is to have a recv() timeout of two seconds, returning an
error if other party didn't either responds all all (TCP error on
connection, adopted via LINGER) or responce time is bigger than 2
seconds (have poll() to timeout after 2 seconds waiting).
Following code does not work (hangs at polling):
package TestPack;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
import java.util.*;
import java.math.BigInteger;
import org.zeromq.ZMQ;
import org.msgpack.*;
class TestPack {
private static void doTest(String tester)
{
byte[] raw = MessagePack.pack(tester);
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket jsocket = context.socket(ZMQ.REQ);
jsocket.setLinger(0);
jsocket.connect ("tcp://localhost:1234");
jsocket.send(raw, 0);
ZMQ.Poller it = context.poller(1);
it.register(jsocket, ZMQ.Poller.POLLIN);
System.out.println("Started polling");
boolean got = false;
it.poll(); // <--- hangs here.
System.out.println("Done polling");
if (it.pollin(0)) {
byte[] reply = jsocket.recv(0);
String decode = new String(reply,0,reply.length-1);
System.out.println(decode);
got = true;
}
if (got == false) {
System.out.println("Received nothing");
}
jsocket.close();
}
public static void main(String[] args)
{
doTest("hello world");
}
}
Following (C++) code worked ok, (don't make me use JNI for having
working poll implementation):
...
zmq::pollitem_t items[] = {
{ socket, 0, ZMQ_POLLIN, 0}
};
zmq::message_t reply;
zmq::poll(items, 1, 2*1000000); // 2 microseconds.
std::cout << "polled" << std::endl;
if (items[0].revents & ZMQ_POLLIN)
{
socket.recv(&reply);
std::cout << "received reply " << std::endl;
} else {
std::cout << "no reply" << std::endl;
}
...
--
cheers,
Igor
More information about the zeromq-dev
mailing list