package com.easemob.tsdb.thrift.rpc; import com.easemob.tsdb.thrift.rpc.service.TSDBDelegate; import com.easemob.tsdb.thrift.rpc.service.ThriftServerFactory; import com.stumbleupon.async.Deferred; import net.opentsdb.core.TSDB; import net.opentsdb.stats.StatsCollector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 这个类是实现了OpenTSDB的 {@link net.opentsdb.tsd.RpcPlugin}的接口 * 需要在OpenTSDB的配置文件中配置 * <code> * tsd.rpc.plugins=com.easemob.thrift.tsdb.rpc.ThriftTSDBRpcPlugin * </code> * <p> * 需要注意的是, 这个plugin只有在OpenTSDB启动的时候才会加载, * 并且当配置多个plugin的时候, 类名用逗号分开, 具体的OpenTSDB配置详见 * http://opentsdb.net/docs/build/html/user_guide/plugins.html#rpc * * @author stliu <stliu@apache.org> * @date 3/11/15 */ @SuppressWarnings("UnusedDeclaration") public class ThriftTSDBRpcPlugin extends AbstractTSDBRpcPlugin { private static final Logger logger = LoggerFactory.getLogger(ThriftTSDBRpcPlugin.class); private static volatile ThriftServerFactory.CustomTDisruptorServer server; @Override public void initialize(final TSDB tsdb) { internalInitialize(new TSDBWrapper(tsdb)); } //for testing purpose only public void internalInitialize(final TSDBDelegate tsdbDelegate) { new Thread() { @Override public void run() { if (server != null && server.isServing()) { logger.warn("thrift server is already started, this probably due to an internal error"); return; } try { ThriftServerFactory factory = new ThriftServerFactory(tsdbDelegate); server = factory.disruptorServerProvider(); server.serve(); logger.info("Thrift RPC Server started"); } catch (Exception e) { logger.error("Failed to start ThriftRPCServer due to Exception", e); throw new IllegalArgumentException(e); } } }.start(); } @Override public Deferred<Object> shutdown() { final Deferred<Object> deferred = new Deferred<>(); new Thread() { @Override public void run() { try { if (server != null && server.isServing()) { logger.info(this.getClass().getName() + " is about to shutdown"); server.stop(); deferred.callback(null); } } catch (Exception e) { logger.error("Failed to stop thrift server due to Exception", e); deferred.callback(e); } } }.start(); return deferred; } @Override public void collectStats(StatsCollector statsCollector) { } }