package com.yiqiniu.easytrans.rpc.impl.dubbo; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Resource; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ReferenceConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.rpc.service.GenericService; import com.yiqiniu.easytrans.config.EasyTransConifg; import com.yiqiniu.easytrans.executor.RelativeInterface; import com.yiqiniu.easytrans.protocol.EasyTransRequest; import com.yiqiniu.easytrans.rpc.EasyTransRpcConsumer; import com.yiqiniu.easytrans.util.ReflectUtil; public class DubboEasyTransRpcConsumerImpl implements EasyTransRpcConsumer{ @Resource private EasyTransConifg config; private Map<String,GenericService> mapRef = new ConcurrentHashMap<String,GenericService>(); @SuppressWarnings("unchecked") @Override public <P extends EasyTransRequest<R, ?>, R extends Serializable> R call(String appId, String busCode, String innerMethod, P params) { GenericService genericService = getCaller(appId, busCode,params); Object result = genericService.$invoke(innerMethod, new String[]{params.getClass().getName()}, new Object[]{params}); // JsonElement jsonTree = gson.toJsonTree(result); // return (R) gson.fromJson(jsonTree, getResultClass(params)); return (R)result; } // private ConcurrentHashMap<Class<?>, Class<?>> mapResultClazz = new ConcurrentHashMap<Class<?>, Class<?>>(); // @SuppressWarnings("unchecked") // private <P extends EasyTransRequest<?, ?>> Class<?> getResultClass(P params) { // // Class<?> resultClazz = mapResultClazz.get(params.getClass()); // if(resultClazz == null){ // resultClazz = ReflectUtil.getResultClass(params.getClass()); // mapResultClazz.put(params.getClass(), resultClazz); // } // return resultClazz; // } private GenericService getCaller(String appId, String busCode,EasyTransRequest<?,?> request) { GenericService genericService = mapRef.get(getTargetKey(appId,busCode)); if(genericService == null){ List<Class<?>> typeArguments = ReflectUtil.getTypeArguments(EasyTransRequest.class, request.getClass()); Class<?> executorCLass = typeArguments.get(1); RelativeInterface annotation = executorCLass.getAnnotation(RelativeInterface.class); Class<?> value = annotation.value(); ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<GenericService>(); referenceConfig.setInterface(value.getName()); // 弱类型接口名 referenceConfig.setVersion("1.0.0"); referenceConfig.setGeneric(true); // 声明为泛化接口 referenceConfig.setApplication(new ApplicationConfig(config.getAppId())); referenceConfig.setRegistry(new RegistryConfig(config.getExtendConfig("zookeeper.url"))); referenceConfig.setGroup(appId + "-" + busCode); referenceConfig.setCheck(false); genericService = referenceConfig.get(); mapRef.put(getTargetKey(appId,busCode), genericService); } return genericService; } private String getTargetKey(String appId, String busCode) { return appId + "|" + busCode; } @Override public <P extends EasyTransRequest<R, ?>, R extends Serializable> void callWithNoReturn( String appId, String busCode, String innerMethod, P params) { GenericService caller = getCaller(appId, busCode,params); caller.$invoke(innerMethod, new String[]{params.getClass().getName()}, new Object[]{params}); return; } }