DubboServiceFactory.java
- package local.demo.genericservice;
- import com.alibaba.dubbo.config.ApplicationConfig;
- import com.alibaba.dubbo.config.ReferenceConfig;
- import com.alibaba.dubbo.config.RegistryConfig;
- import com.alibaba.dubbo.config.utils.ReferenceConfigCache;
- import com.alibaba.dubbo.rpc.service.GenericService;
- import java.io.IOException;
- import java.util.List;
- import java.util.Map;
- import java.util.Properties;
- /**
- * Created by Luo
- */
- public class DubboServiceFactory {
- private ApplicationConfig application;
- private RegistryConfig registry;
- private static class SingletonHolder {private static DubboServiceFactory INSTANCE = new DubboServiceFactory();
- }
- private DubboServiceFactory(){
- Properties prop = new Properties();
- ClassLoader loader = DubboServiceFactory.class.getClassLoader();
- try {
- prop.load(loader.getResourceAsStream("dubboconf.properties"));
- } catch (IOException e) {
- e.printStackTrace();
- }
- ApplicationConfig applicationConfig = new ApplicationConfig();
- applicationConfig.setName(prop.getProperty("application.name"));
- // 这里配置了 dubbo 的 application 信息 *(demo 只配置了 name)*, 因此 demo 没有额外的 dubbo.xml 配置文件
- RegistryConfig registryConfig = new RegistryConfig();
- registryConfig.setAddress(prop.getProperty("registry.address"));
- // 这里配置 dubbo 的注册中心信息, 因此 demo 没有额外的 dubbo.xml 配置文件
- this.application = applicationConfig;
- this.registry = registryConfig;
- }
- public static DubboServiceFactory getInstance() {
- return SingletonHolder.INSTANCE;
- }
- public Object genericInvoke(String interfaceClass, String methodName, List> parameters){
- ReferenceConfig reference = new ReferenceConfig();
- reference.setApplication(application);
- reference.setRegistry(registry);
- reference.setInterface(interfaceClass); // 接口名
- reference.setGeneric(true); // 声明为泛化接口
- //ReferenceConfig 实例很重, 封装了与注册中心的连接以及与提供者的连接,
- // 需要缓存, 否则重复生成 ReferenceConfig 可能造成性能问题并且会有内存和连接泄漏.
- //API 方式编程时, 容易忽略此问题.
- // 这里使用 dubbo 内置的简单缓存工具类进行缓存
- ReferenceConfigCache cache = ReferenceConfigCache.getCache();
- GenericService genericService = cache.get(reference);
- // 用 com.alibaba.dubbo.rpc.service.GenericService 可以替代所有接口引用
- int len = parameters.size();
- String[] invokeParamTyeps = new String[len];
- Object[] invokeParams = new Object[len];
- for(int i = 0; i < len; i++){
- invokeParamTyeps[i] = parameters.get(i).get("ParamType") + "";
- invokeParams[i] = parameters.get(i).get("Object");
- }
- return genericService.$invoke(methodName, invokeParamTyeps, invokeParams);
- }
- }
来源: http://www.jianshu.com/p/3be78d952bac