zoukankan      html  css  js  c++  java
  • [编织消息框架][JAVA核心技术]动态代理应用11-水平扩展实现

    由于示例,远程服务地址配置在properties文件,通过QMConfig类加载,最优方式是上节介绍过,放在共享内存上,只需要维护一份数据即可,如放在redis上

        /** 服务地址<service,address> **/
        @FieldValue("QM.REMOTE_SERVICE")
        public Map<String, String> REMOTE_SERVICE = new HashMap<>();
    
        public boolean isRemoteService(Class<?> target) {
            if (!target.isInterface()) {
                target = ReflectUtil.getInterfaceForAnno(target, QModel.class);
            }
            return REMOTE_SERVICE.containsKey(target.getName());
        }

     qm.properties 加上

    QM.REMOTE_SERVICE={"com.eyu.onequeue.rpc.ITestEnhance":"xxx.xxx.xxx.xxx:22222"}

    QRpcFactory.class 添加代码

        public static <T> T loadSystemService(Class<T> target) {
            T ret = null;
            if (QMConfig.getInstance().isRemoteService(target)) {
                // read config
                String address = QMConfig.getInstance().REMOTE_SERVICE.get(target.getName());
                ret = loadSendProxy(target, address);
            } else {
                ret = loadLocalProxy(target);
            }
            return ret;
        }

    测试代码:

        @Test
        public void testSystemService() {
            Set<Class<?>> values = new HashSet<>();
            PackageScanner.scan((clz) -> {
                QModel modelAnno = ReflectUtil.getAnno(clz, QModel.class);
                if (modelAnno == null) {
                    return;
                }
                values.add(clz);
            } , "com.eyu.onequeue");
    
            for (Class<?> clz : values) {
                if (clz.isInterface()) {
                    if (!QMConfig.getInstance().isRemoteService(clz)) {
                        continue;
                    }
                    QRpcFactory.registerSendProxy(clz);
                    System.out.println("registerSendProxy : " + clz);
                } else {
                    if (QMConfig.getInstance().isRemoteService(clz)) {
                        continue;
                    }
                    try {
                        QRpcFactory.registerReceiveProxy(clz.newInstance());
                        System.out.println("registerReceiveProxy : " + clz);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
    
            //test removet
            ITestEnhance obj = QRpcFactory.loadSystemService(ITestEnhance.class);
            obj.a(1d);
            //test local
            TestObject obj1 = QRpcFactory.loadSystemService(TestObject.class);
            obj1.a(1, "b");
        }
  • 相关阅读:
    【转】解决数据库不能更新或数据库或对象为只读
    qt 5 小练习 简易画板
    qt5 基础知识
    qt 5 基础知识 2(控件篇)
    连接sql server、插入数据、从数据库获取时间(C#)
    冒泡排序(C#)
    获取文件的MD5码(C#)
    微信公众平台开发——关于网页签名那些事
    微信公众平台——token验证php版
    浏览器基本工作方法
  • 原文地址:https://www.cnblogs.com/solq111/p/6722243.html
Copyright © 2011-2022 走看看