package org.act.tstream.message.zeroMq; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zeromq.ZMQ.Context; import org.zeromq.ZMQ.Socket; import backtype.storm.Config; import backtype.storm.messaging.IConnection; import backtype.storm.messaging.IContext; import org.act.tstream.client.ConfigExtension; import org.act.tstream.cluster.StormConfig; import org.act.tstream.utils.JStormUtils; /** * zeroMQ context * * @author yannian/Longda/zhiyuan.ls * */ public class MQContext implements IContext { protected final static Logger LOG = LoggerFactory.getLogger(MQContext.class); protected Map storm_conf; protected int zmqThreads; protected int linger_ms; protected boolean ipc; protected boolean virtportZmq = false; protected int maxQueueMsg; private Context context; @Override public void prepare(Map storm_conf) { this.storm_conf = storm_conf; zmqThreads = JStormUtils.parseInt(storm_conf .get(Config.ZMQ_THREADS)); linger_ms = JStormUtils.parseInt(storm_conf .get(Config.ZMQ_LINGER_MILLIS)); ipc = StormConfig.cluster_mode(storm_conf).equals("local"); virtportZmq = JStormUtils.parseBoolean( storm_conf.get(Config.STORM_LOCAL_MODE_ZMQ), false); maxQueueMsg = JStormUtils.parseInt(storm_conf.get(Config.ZMQ_HWM), ConfigExtension.DEFAULT_ZMQ_MAX_QUEUE_MSG); init(); LOG.info("MQContext prepare done..."); } protected void init() { context = ZeroMq.context(zmqThreads); } @SuppressWarnings("unused") protected MQContext() { } @Override public IConnection bind(String topology_id, int port) { return zmq_bind(true, port); } protected IConnection zmq_bind(boolean distributeZmq, int port) { String url = null; if (distributeZmq) { if (ipc) { url = "ipc://" + port + ".ipc"; } else { url = "tcp://*:" + port; } } else { // virtportZmq will be true url = "inproc://" + port; } Socket socket = ZeroMq.socket(context, ZeroMq.pull); ZeroMq.bind(socket, url); ZeroMq.set_hwm(socket, maxQueueMsg); // ZeroMq.subscribe(socket); LOG.info("Create zmq receiver {}", url); return new ZMQRecvConnection(socket); } @Override public IConnection connect(String topology_id, String host, int port) { return zmq_connect(true, host, port); } protected IConnection zmq_connect(boolean distributeZmq, String host, int port) { String url = null; if (distributeZmq) { if (ipc) { url = "ipc://" + port + ".ipc"; } else { url = "tcp://" + host + ":" + port; } } else { // virtportZmq will be true url = "inproc://" + port; } Socket socket = ZeroMq.socket(context, ZeroMq.push); socket = ZeroMq.set_linger(socket, linger_ms); socket = ZeroMq.connect(socket, url); ZeroMq.set_hwm(socket, maxQueueMsg); LOG.info("Create zmq sender {}", url); return new ZMQSendConnection(socket, host, port); } public void term() { LOG.info("ZMQ context terminates "); context.term(); } // public Context getContext() { // return context; // } }