package cz.cuni.mff.d3s.been.socketworks.twoway; import java.util.Iterator; import org.jeromq.ZMQ; import org.jeromq.ZMQ.Socket; import cz.cuni.mff.d3s.been.mq.Context; import cz.cuni.mff.d3s.been.mq.MessagingException; import cz.cuni.mff.d3s.been.mq.ZMQContext; import cz.cuni.mff.d3s.been.socketworks.Socketworks; /** * A (maybe unnecessary) implementation of a 0MQ dealer. Its job is to convey * frames received from the pipeline handler back to the low-level 0MQ sockets. * * @author darklight * */ class PipelineDealer extends PollPartaker { private static final int NOFLAGS = 0; private PipelineDealer(Socket mySocket, String hostname, FrameForwardMapper replyMapper) { super(mySocket, hostname, replyMapper); } public static PipelineDealer create(Socket mySocket, String hostname, FrameForwardMapper replyMapper) { return new PipelineDealer(mySocket, hostname, replyMapper); } @Override public int getPollType() { return ZMQ.POLLIN; } @Override public void receiveFromBuddy(Frames frames) throws MessagingException { // this content is thread-safe because it creates/cleans its own sockets final ZMQContext zctx = Context.getReference(); final Socket sendReplySocket = zctx.socket(ZMQ.DEALER); final Iterator<byte[]> fi = frames.iterator(); sendReplySocket.connect(Socketworks.Protocol.TCP.connection(hostname, port)); int lastFrameSize = 0; while (fi.hasNext()) { final byte[] frame = fi.next(); sendReplySocket.send(frame, fi.hasNext() ? ZMQ.SNDMORE : NOFLAGS); lastFrameSize = frame.length; } // JeroMQ big message bug workaround (big messages not transmitted completely) if (lastFrameSize > 100_000) { try { Thread.sleep(500); } catch (InterruptedException e) { //quell } } sendReplySocket.close(); } }