package com.alipay.bluewhale.core.work.transfer; import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; import org.apache.log4j.Logger; import com.alipay.bluewhale.core.callback.RunnableCallback; import com.alipay.bluewhale.core.daemon.NodePort; import com.alipay.bluewhale.core.messaging.IConnection; /** * ���ڽ�transfer_queue�������Ϣ�����͸�Ŀ��worker * * ֮ǰһֱ�Ƚϵ���->worker���͵���Ϣ����һ�����߳��з��ͣ����ijһ���̷߳��й����г������ⱻ����������ͻᱻ����ס * ��zeromq�IJ��Է��֣�����ʹ�õ����첽�ķ�ʽ ��һ��ֱ��connectһ��tcp�Ķ˿ڣ�ʵ��û���κν��ն˰󶨣�Ȼ������Ϣ������û������ * Ȼ��sleep һ�룬���ն˿�ʼbind ��Ȼ���������յ���Ϣ * * @author yannian * */ public class DrainerRunable extends RunnableCallback { private final static Logger LOG = Logger.getLogger(DrainerRunable.class); private LinkedBlockingQueue<TransferData> transferQueue; private ConcurrentHashMap<NodePort, IConnection> nodeportSocket; private ConcurrentHashMap<Integer, NodePort> taskNodeport; public DrainerRunable(LinkedBlockingQueue<TransferData> transfer_queue, ConcurrentHashMap<NodePort, IConnection> node_port__socket, ConcurrentHashMap<Integer, NodePort> task__node_port) { this.transferQueue = transfer_queue; this.nodeportSocket = node_port__socket; this.taskNodeport = task__node_port; } @Override public void run() { try { TransferData felem = transferQueue.take(); if (felem != null) { ArrayList<TransferData> drainer = new ArrayList<TransferData>(); drainer.add(felem); transferQueue.drainTo(drainer); for (TransferData o : drainer) { int taskId = o.getTaskid(); byte[] tuple = o.getData(); NodePort nodePort = taskNodeport.get(taskId); if (nodePort == null) { String errormsg = "can`t not found IConnection"; LOG.warn("DrainerRunable warn", new Exception( errormsg)); continue; } IConnection conn = nodeportSocket.get(nodePort); if (conn == null) { String errormsg = "can`t not found nodePort"; LOG.warn("DrainerRunable warn", new Exception( errormsg)); continue; } conn.send(taskId, tuple); } drainer.clear(); } } catch (Exception e) { LOG.error("DrainerRunable send error", e); } } @Override public Object getResult() { return 0; } }