package org.act.tstream.message.zeroMq; import java.util.List; import org.act.tstream.callback.AsyncLoopThread; import org.act.tstream.callback.RunnableCallback; import org.apache.log4j.Logger; import org.zeromq.ZMQ.Socket; import backtype.storm.messaging.IConnection; import backtype.storm.messaging.TaskMessage; import backtype.storm.serialization.KryoTupleDeserializer; import backtype.storm.utils.DisruptorQueue; /** * * @author longda * */ public class ZMQRecvConnection extends RunnableCallback implements IConnection { private static final Logger LOG = Logger.getLogger(ZMQRecvConnection.class); private Socket socket; private boolean closed = false; private DisruptorQueue recvQueue; public ZMQRecvConnection(Socket _socket) { socket = _socket; new AsyncLoopThread(this, true, Thread.MAX_PRIORITY, true); } @Override public TaskMessage recv(int flags) { byte[] data = ZeroMq.recv(socket, flags); if (data == null || data.length <= 4) { return null; } int port = KryoTupleDeserializer.deserializeTaskId(data); return new TaskMessage(port, data); } @Override public void close() { socket.close(); closed = true; } @Override public boolean isClosed() { return closed; } @Override public void send(List<TaskMessage> messages) { throw new UnsupportedOperationException( "Server connection should not send any messages"); } @Override public void send(TaskMessage message) { throw new UnsupportedOperationException( "Server connection should not send any messages"); } @Override public void registerQueue(DisruptorQueue recvQueu) { this.recvQueue = recvQueu; } @Override public void enqueue(TaskMessage message) { if (message != null ) { recvQueue.publish(message); } } @Override public void run() { LOG.info("Successfully start ZMQ Recv thread"); while(isClosed() == false) { try { TaskMessage message = recv(0); enqueue(message); }catch (Exception e) { LOG.warn("ZMQ Recv thread receive error", e); } } LOG.info("Successfully shutdown ZMQ Recv thread"); } @Override public Object getResult() { LOG.info("Begin to shutdown ZMQ Recv thread"); return -1; } }