[编织消息框架][rpc]使用篇
rpc 分两部份,一个是调用者,另一方是服务提供者
调用者只关心那个服务,传相应参数,返回内容就可以
而提供者根据调用相应服务同参数,工作处理后响应内容即可
根据他们的关系可以用JAVA 接口同实现类 来约束书写完成功能
@QModel(1)
public interface ITestEnhance {
@QCommond(1)
public void a(double a); @QCommond(2)
public void b(float a); @QCommond(3)
public void c(byte a); @QCommond(4)
public void d(long a); @QCommond(5)
public void e(TestMessageObject obj); @QCommond(6)
public void f(AtomicLong al); @QCommond(7)
public TestMessageObject g(AtomicLong a,long b,TestMessageObject c);
}
接口
public class TestEnhanceImpl implements ITestEnhance {
@Override
public void a(double a) {
System.out.println("a接收到 数值 : " + a);
}
@Override
public void b(float a) {
System.out.println("b接收到 数值 : " + a);
}
@Override
public void c(byte a) {
System.out.println("c接收到 数值 : " + a);
}
@Override
public void d(long a) {
System.out.println("d接收到 数值 : " + a);
}
@Override
public void e(TestMessageObject obj) {
if (obj == null) {
return;
}
System.out.println("e接收到 数值 : " + SerialUtil.writeValueAsString(obj));
}
@Override
public void f(AtomicLong a) {
System.out.println("f接收到 数值 : " + a.get());
}
@Override
public TestMessageObject g(AtomicLong a, long b, TestMessageObject c) {
System.out.println("g接收到 数值 : " + a.get());
System.out.println("g接收到 数值 : " + b);
System.out.println("g接收到 数值 : " + SerialUtil.writeValueAsString(c));
return c;
}
public static void main(String[] args) {
ITestEnhance proxyObject = QRpcFactory.loadProxy(ITestEnhance.class,1L);
QRpcFactory.registerInvokeService(new TestEnhanceImpl());
proxyObject.a(-0.2);
proxyObject.b(0);
proxyObject.c((byte) 0x0);
proxyObject.c((byte) 0x1);
proxyObject.d((byte) 0x1);
proxyObject.e(TestMessageObject.of());
proxyObject.f(new AtomicLong(-9));
proxyObject.e(null);
TestMessageObject obj=proxyObject.g(new AtomicLong(-11112), Long.MAX_VALUE, TestMessageObject.of());
SerialUtil.println(obj);
}
}
实现类
/****
*
* @author solq
*/
public abstract class QRpcFactory {
private final static QRpcEnhanceService enhanceService = QRpcEnhanceService.getFactory(); public static <T> T loadProxy(Class<T> target, QNode... nodes) {
JavassistProxy.getDefault().register(target, enhanceService);
T ret = JavassistProxy.getDefault().transform(target);
IRpcContext ctx = (IRpcContext) ret;
ctx.setContext(RpcContext.of(nodes));
return ret;
} public static <T> T loadProxy(Class<T> target, long... ids) {
JavassistProxy.getDefault().register(target, enhanceService);
T ret = JavassistProxy.getDefault().transform(target);
IRpcContext ctx = (IRpcContext) ret;
ctx.setContext(RpcContext.of(ids));
return ret;
} public static void registerInvokeService(Object target) {
enhanceService.registerInvokeService(target);
}
}
rpc调用同注册工厂
a接收到 数值 : -0.2
b接收到 数值 : 0.0
c接收到 数值 : 0
c接收到 数值 : 1
d接收到 数值 : 1
e接收到 数值 : {"start":1487901957121}
f接收到 数值 : -9
g接收到 数值 : -11112
g接收到 数值 : 9223372036854775807
g接收到 数值 : {"start":1487901957157}
{"start":1487901957157}
为什么要这样做?其实也可以用最原理的方式socket 或http 或JAVA 本身提供的rpc来做,自己做轮子跟使用轮子创造出来的价值是不能相比
处理做法上面说得很清楚,具体实现细节我在新书里会写出来,欢迎大家关注
[编织消息框架][rpc]使用篇的更多相关文章
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- [编织消息框架][JAVA核心技术]动态代理应用12-总结
动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预 ...
- [编织消息框架][传输协议]sctp
OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型. 该体系结构标准定义了网络互连的七 ...
- [编织消息框架][JAVA核心技术]动态代理应用4
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][JAVA核心技术]动态代理应用1
前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...
- [编织消息框架][JAVA核心技术]数值与逻辑分离
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...
- [编织消息框架][JAVA核心技术]动态代理应用4-annotationProcessor
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][网络IO模型]BIO
既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...
- [编织消息框架][消息服务]jmx
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架,使用的是RMI技术. 比较经典的应用jdk bin目录下 jcons ...
随机推荐
- IOC:AutoFac使用demo
使用autofac 实现依赖注入 1.引用 autofac.dll 和 autofac.configuration.dll 2.新增接口 IDAL using System; using System ...
- .NET防止重复提交数据
最近在做一个销售系统的时候,操作人员提交数据的时候数据库竟然会出现多条数据相同的记录,并且是在1秒之内,客户反馈给我们,第一反应是重复提交的问题,检查了下代码,程序执行完成后应该是跳转到别的页面的,可 ...
- 大话设计模式--委托--IOS
最近看了一些关于IOS委托的文章,看完之后,感觉不大好. 引文: 委托delegation是一种简单但是功能强大的设计模式,它的功能是程序中一个对象代表另一个对象,或者一个对象与另外一个对象协同工作. ...
- Rest Project Performace Pressure Test
首次调整基线和配置修改 机器配置为 CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.6GHz 24core 内存: 128G JDK Ver: 1.7.0_80 To ...
- 【Android】Activity
一.Android四大组件 Activity.Service.BroadCastReceiver.ContentProvider. 二.Activity的继承关系 三.建立.配置和使用Activity ...
- jQuery如何创建元素
1.$("<ul>").attr("id","taglist").appendTo("#tagCloud") ...
- MariaDB10自动化安装部署
去MariaDB官网下载MariaDB本文用的是MariaDB 10.1.16 https://downloads.mariadb.org 选择二进制版本,下载到/root目录下 mariadb-10 ...
- HDU-1864-最大报销额
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1864 这题开始题意没搞清楚,就做题了,导致浪费了很多的时间,不应该啊, 注意事项:每张发票上,单项物品 ...
- Camera.ScreenPointToRay 解析
Unity官方文档: Camera.ScreenPointToRay public function ScreenPointToRay(position: Vector3): Ray; Descrip ...
- cookie、session、sessionid的区别
我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案: 1.凭借柜台职员的记忆,由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速这个顾客当 ...