package com.dounine.corgi.rpc; import com.dounine.corgi.cluster.Balance; import com.dounine.corgi.rpc.interceptor.RpcInterceptor; import com.dounine.corgi.rpc.invoke.Invocation; import com.dounine.corgi.rpc.invoke.RpcInvocation; import com.dounine.corgi.rpc.listen.RpcContainer; import com.dounine.corgi.rpc.protocol.IProtocol; import com.dounine.corgi.rpc.register.IRegister; import com.dounine.corgi.rpc.spring.annotation.Reference; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by huanghuanlai on 2016/10/18. */ public class RpcApp { private static final Logger LOGGER = LoggerFactory.getLogger(RpcApp.class); public static final Enhancer ENHANCER = new Enhancer(); private IProtocol protocol; private String appName; private static final RpcApp APP = new RpcApp(); private RpcApp() { } public final static RpcApp init(IProtocol protocol,String appName) { APP.setProtocol(protocol); APP.setAppName(appName); return APP; } public final static RpcApp instance() { return APP; } public void export() { LOGGER.info(getAppName() + " exporting..."); new Thread(new RpcContainer(getProtocol())).start(); } public <T> T getProxy(Class<T> interfaceClass, Reference reference, Balance balance) { Invocation<T> invocation = new RpcInvocation<T>(reference, balance); Callback callback = new RpcInterceptor(invocation); ENHANCER.setCallback(callback); ENHANCER.setInterfaces(new Class<?>[]{interfaceClass}); return (T) ENHANCER.create(); } public IProtocol getProtocol() { return protocol; } public void setProtocol(IProtocol protocol) { this.protocol = protocol; } public String getAppName() { return appName; } public void setAppName(String appName) { this.appName = appName; } }