package cz.cuni.mff.d3s.been.socketworks.twoway; import java.util.Iterator; import java.util.UUID; import cz.cuni.mff.d3s.been.cluster.Service; import cz.cuni.mff.d3s.been.cluster.ServiceException; import cz.cuni.mff.d3s.been.socketworks.Socketworks; import org.jeromq.ZMQ; import org.jeromq.ZMQ.Socket; import cz.cuni.mff.d3s.been.mq.MessagingException; /** * A participant in the poll pipeline. Represents a socket and actions taken for * events received on that socket. * * @author darklight * */ abstract class PollPartaker implements FrameSink { private static final int NOFLAGS = 0; final String hostname; Integer port; final Socket mySocket; final FrameForwardMapper replyMapper; protected PollPartaker(Socket mySocket, String hostname, FrameForwardMapper replyMapper) { this.hostname = hostname; this.mySocket = mySocket; this.replyMapper = replyMapper; } protected final void forward(Frames frames) throws MessagingException { final FrameSink target = replyMapper.getForwardFor(this); if (target == null) { throw new MessagingException(String.format("Cannot find forward destination for sink %s", toString())); } target.receiveFromBuddy(frames); } protected final void send(Frames frames) throws MessagingException { final Iterator<byte[]> i = frames.iterator(); // the send can usually happen from various threads synchronized (mySocket) { while (i.hasNext()) { final byte[] frame = i.next(); mySocket.send(frame, (i.hasNext()) ? ZMQ.SNDMORE : NOFLAGS); } } } @Override public void receiveFromBuddy(Frames frames) throws MessagingException { send(frames); } @Override public void receiveFromWire(Frames frames) throws MessagingException { forward(frames); } public void start() { port = mySocket.bindToRandomPort(Socketworks.Protocol.TCP.bindAddr(hostname)); } public void stop() { port = null; mySocket.close(); } Socket getSocket() { return mySocket; } public Integer getPort() { return port; } public abstract int getPollType(); }