[编织消息框架][设计协议]opCode
OpCode(Operation Code) 操作码的意思。
OpCode 有几种域组成,不同领域格式组成不同
1.指令号
2.数据范围
3.数据内容
如 {code}{addr range}{data}
{1}{2-5}{2至5地址内容为 "你好"}
{2}{6-10}{6至10地址内容为 "hello"}
这种编码可以应用到其它领域,本项目用的格式是
{data model}{data}
源码解读
QOpCode 类维护所有opCode
/**
* @author solq
**/
@Target(TYPE)
@Retention(RUNTIME)
public @interface QOpCode {
short value(); public static final short QPRODUCE = 1;
public static final short QCONSUME = 2;
public static final short QSUBSCIBE = 3;
public static final short QCODE = 4;
public static final short QRPC = 5; }
QDispenseHandler.class
private void doReceive0(QPacket packet, ChannelHandlerContext ctx) {
boolean response = packet.hasStatus(QPacket.MASK_RESPONSE);
// 业务处理
final short c = packet.getC();
switch (c) {
case QOpCode.QPRODUCE:
if (produceHandler != null) {
QProduce produce = packet.toProduce();
produceHandler.onReceive(ctx, packet, produce);
}
break;
case QOpCode.QCONSUME:
if (consumeHandler != null) {
QConsume qConsume = packet.toConsume();
consumeHandler.onReceive(ctx, packet, qConsume);
}
break;
case QOpCode.QSUBSCIBE:
if (subscribeHandler != null) {
Collection<QSubscribe> qSubscribe = packet.toSubscribe();
subscribeHandler.onReceive(ctx, packet, qSubscribe);
}
break;
case QOpCode.QRPC:
response = false;
// 业务回写请求
if (rpcHandler != null) {
QRpc qRpc = packet.toRpc();
rpcHandler.onReceive(ctx, packet, qRpc);
}
break;
case QOpCode.QCODE:
response = false;
// 响应请求
if (responseHandler != null) {
short code = packet.toCode();
responseHandler.onReceive(ctx, packet, code);
}
break;
default:
throw new QSocketException(QCode.SOCKET_UNKNOWN_OPCODE, " opCode : " + c);
}
}
根据不同的model code 进行解释,然后调用应用层处理
其中应用层处理统一实现 IQReceiveHandler 接口规范处理参数同处理行为
//应用层逻辑
protected IQReceiveHandler<QProduce> produceHandler;
protected IQReceiveHandler<QConsume> consumeHandler;
protected IQReceiveHandler<Collection<QSubscribe>> subscribeHandler;
protected IQReceiveHandler<Short> responseHandler;
protected IQReceiveHandler<QRpc> rpcHandler; //通信层逻辑
protected IQReceiveHandler<Void> acceptHandler;
protected IQReceiveHandler<Void> closeHandler; protected IQReceiveHandler<Void> beforeHandler;
protected IQReceiveHandler<Void> afterHandler;
/**
*
* 响应端 业务逻辑
*
* @author solq
**/
public interface IQReceiveHandler<T> { void onReceive(ChannelHandlerContext ctx,QPacket packet, T body); }
[编织消息框架][设计协议]opCode的更多相关文章
- [编织消息框架][设计协议]优化long,int转换
理论部分 一个long占8byte,大多数应用业数值不超过int每次传输多4byte会很浪费 有没有什么办法可以压缩long或int呢? 答案是有的,原理好简单,如果数值不超过int.max_valu ...
- [编织消息框架][设计协议]bit基础
理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数 ...
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- [编织消息框架][传输协议]sctp
OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型. 该体系结构标准定义了网络互连的七 ...
- [编织消息框架][JAVA核心技术]动态代理应用4
基础部份: 接下来讲编译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 ...
- [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现
NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLo ...
- [编织消息框架][netty源码分析]7 Unsafe 实现类NioSocketChannelUnsafe职责与实现
Unsafe 是channel的内部接口,从书写跟命名上看是不公开给开发者使用的,直到最后实现NioSocketChannelUnsafe也没有公开出去 public interface Channe ...
随机推荐
- Spring3.2AOP实现需要添加的三个包
Spring3.2AOP实现需要添加的三个包 http://down.51cto.com/data/1001395 http://down.51cto.com/data/519542
- Spring MVC 返回NULL时客户端用$.getJSON的问题
如果Spring MVC返回是NULL,那么客户端的$.getJSON就不会触发: 必须返回点什么东西: 如果返回的是一个字符串,客户端的$.getJSON也不会触发:把字符串 包装成List< ...
- .NET操作RabbitMQ组件EasyNetQ使用中文简版文档。
本文出自EasyNetQ官方文档,内容为自己理解加翻译.文档地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Quick-Start EasyNetQ简介 Ea ...
- 【费式数列(Fibonacci数列)】
/* 说明: Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后也开 始生产.起初只有一只兔子,一个月后就有两只兔子,二个月后就有三只兔子,三 ...
- 蓝桥网试题 java 基础练习 时间转换
--------------------------------------- --------------------------------------- import java.util.*; ...
- php下安装动态扩展库的相关事项
php下安装动态扩展库的相关事项 我下载的Apache版本为2.4,PHP版本为7.0. 将Apache与PHP集成配置好后(PHP安装目录为:G:\computer\web\php7,apache安 ...
- [Bullet3]常见物体和初始化
官方文档:http://bulletphysics.org 开源代码:https://github.com/bulletphysics/bullet3/releases API文档:http://bu ...
- sed 命令详解
sed 用于筛选和转换文本的流编辑器 描述: sed是一个流编辑器,流编辑器对一个输入流执行基本的文本转换(输入流来自文件或者管道行).虽然在某些方面类似于很多可运行脚本的编辑器,但是sed的工作方式 ...
- LinkedList底层实现,及其数据结构实现。
LinkedList底层的实现基于双向表 prev data next next指向下一个node的地址.prev指向上一个node. 这里的代码是LinkedList类的源码. private st ...
- iOS获取本地时间
NSDate *currentDate = [NSDate date];//获取当前时间,日期 NSDateFormatter *dateFormatter = [[NSDateFormatter a ...