package com.alipay.bluewhale.core.zilch; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.zeromq.ZMQ.Context; import org.zeromq.ZMQ.Socket; import com.alipay.bluewhale.core.callback.RunnableCallback; /** * ��Ϣ�ķַ� * * @author yannian * */ public class VirtualPortDispatch extends RunnableCallback { private final static Logger LOG = Logger .getLogger(VirtualPortDispatch.class); private Context context; private Socket socket; private Map<Integer, Socket> virtual_mapping; private String url; private Set<Integer> valid_ports = null; public VirtualPortDispatch(Context context, Socket socket, Map<Integer, Socket> virtual_mapping, String url, Set<Integer> valid_ports) { this.context = context; this.socket = socket; this.virtual_mapping = virtual_mapping; this.url = url; this.valid_ports = valid_ports; } @Override public void run() { if (socket != null) { byte[] data = ZeroMq.recv(socket); PacketPair packet = VirtualPort.parse_packet(data); if (packet.getPort() == -1) { LOG.info("Virtual port " + url + " received shutdown notice"); VirtualPort.close_virtual_sockets(virtual_mapping); socket.close(); socket = null; } else { if (valid_ports == null || valid_ports.contains(packet.getPort())) { Socket virtual_socket = VirtualPort.get_virtual_socket( context, virtual_mapping, packet.getPort(), url); ZeroMq.send(virtual_socket, packet.getMessage()); } else { //LOG.info("Received invalid message directed at port " // + packet.getPort() + ". Dropping..."); } } } } @Override public Object getResult() { return socket == null ? -1 : 0; } }