[编织消息框架][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");
    }

 

posted @ 2017-04-17 11:58  solq321  阅读(294)  评论(0编辑  收藏  举报