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");
        }
  • 相关阅读:
    OpenERP 7.0 中文报表PDF乱码(WindowsXP)
    【转】CentOS 6.3 X64自动安装OpenERP 7.0脚本
    OE7设置菜单为什么这么少?
    PostgreSQL的备份和恢复
    PyPI镜像网站
    【转】Win 7 下源码运行OpenERP7.0
    OpenERP中的会计凭证
    OpenERP实施记录(14):收款处理
    OpenERP实施记录(13):出库处理
    intro.js 页面引导简单用法
  • 原文地址:https://www.cnblogs.com/solq111/p/6722243.html
Copyright © 2011-2022 走看看