QException是项目业务异常基类 按模块划分子类异常,方便定位那块出错

有个来源码属性code作用定位某个功能处理出错逻辑,数字类型节省内存空间,同时减少创建子类的子类

QSocketException 是通信层出错 凡是来自QSocketException 统一认为非法请求,强制关闭socket连接

QJsonException 是json编解码出错 json很流行种数据格式,跨平台特点,经常处理

QEnhanceException 是Javassist动态生成java class技术,用于替换jdk 动态代理

 public class QException extends RuntimeException {

     private static final long serialVersionUID = -3110633035340065406L;

     private short code;

     public short getCode() {
return code;
} public QException(short code, String message, Throwable cause) {
super(message, cause);
this.code = code;
} public QException(short code) {
super();
this.code = code;
} public QException(short code, String message) {
super(message);
this.code = code;
} }

QException

接下来应用异常

首先要找到所有业务调用的主入口,由于用的是netty通信框架,对于服务端来讲要找到接收数据的方法

ChannelDuplexHandler 是netty提供的业务实现的类,其中channelRead是接收数据的方法

 @Sharable
public class QMessageHandler extends ChannelDuplexHandler { private QDispenseHandler dispenseHandler; public QMessageHandler(QDispenseHandler dispenseHandler) {
this.dispenseHandler = dispenseHandler;
} @Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
dispenseHandler.doConnect(ctx);
super.channelActive(ctx);
} @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
dispenseHandler.doReceive(msg, ctx);
super.channelRead(ctx, msg);
} @Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
dispenseHandler.doClose(ctx);
super.channelInactive(ctx);
}
}

QDispenseHandler.class

当业务处理失败时,响应三种策略

1.优先处理来自QSocketException强制关闭socket连接

2.业务边界QException

3.未知错误Exception

第一种情况不用返回响应码

第二三种情况是否返回根据客户端请求状态决定 boolean response = packet.hasStatus(QPacket.MASK_RESPONSE)

  public void doReceive(Object msg, ChannelHandlerContext ctx) {
if (msg instanceof QPacket) {
pool.execute(() -> {
doReceive0((QPacket) msg, ctx);
});
}
} private void doReceive0(QPacket packet, ChannelHandlerContext ctx) { boolean response = packet.hasStatus(QPacket.MASK_RESPONSE);
try {
//doReceive ... 处理省略细节 } catch (QSocketException e) {
// socket异常 关闭连接
packet.responseCode(e.getCode());
LOGGER.error("QSocketException msg {} error : {}", QCodeUtil.getDes( e.getCode()), e);
if (response) {
ChannelFuture future = ctx.channel().writeAndFlush(packet);
future.addListener(new GenericFutureListener<Future<? super Void>>() {
@Override
public void operationComplete(Future<? super Void> future) throws Exception {
NettyUtil.closeChannel(CLOSE_SOURCE.SOCKET_ERROR, false, ctx.channel());
}
});
} else {
NettyUtil.closeChannel(CLOSE_SOURCE.SOCKET_ERROR, false, ctx.channel());
}
return;
} catch (QException e) {
// 业务异常 响应失败
packet.responseCode(e.getCode());
LOGGER.error("QException msg {} error : {}",QCodeUtil.getDes( e.getCode()), e);
} catch (Exception e) {
// 未知异常 响应失败
packet.responseCode(QCode.ERROR_UNKNOWN);
LOGGER.error("UNKNOWNException error : {}", e);
}
if (response) {
ctx.channel().writeAndFlush(packet);
}
}

[编织消息框架][JAVA核心技术]异常应用的更多相关文章

  1. [编织消息框架][JAVA核心技术]异常基础

    Java异常体系结构 Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常. 其中异常类Exception又分为运行时异常(RuntimeExcept ...

  2. [编织消息框架][JAVA核心技术]动态代理应用4

    基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...

  3. [编织消息框架][JAVA核心技术]annotation基础

    应用动态代理技术要先掌握annotation技术 注解是JDK1.5之后才有的新特性,JDK1.5之后内部提供的三个注解 @Deprecated 意思是“废弃的,过时的” @Override 意思是“ ...

  4. [编织消息框架][JAVA核心技术]动态代理应用12-总结

    动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预 ...

  5. [编织消息框架][JAVA核心技术]数值与逻辑分离

    为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...

  6. [编织消息框架][JAVA核心技术]动态代理应用4-annotationProcessor

    基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...

  7. [编织消息框架][JAVA核心技术]jdk动态代理

    需要用到的工具  jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.Invocation ...

  8. [编织消息框架][JAVA核心技术]动态代理应用2

    接下来如何实现 第一步:先把服务类,调用方法转换成数字,方便传输 第二步:提取元信息,提取又有三种方式,三种各有优点,最优方式是第一种 1.编译java时处理 2.程序启动时处理,预处理 3.调用时处 ...

  9. [编织消息框架][JAVA核心技术]动态代理应用5-javassist

    基础部份: 修改class我们用到javassist,在pom.xml添加 <properties> <javassist.version>3.18.2-GA</java ...

随机推荐

  1. ACM HDU 1559 最大子矩阵

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1559 这道题 挺好的,当时想出解法的时候已经比较迟了.还是平时看得少. 把行与列都进行压缩.ans[i ...

  2. centos 下安装pptp (vpn) 的方法

    废话少说     01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...

  3. Code Kata:螺旋矩阵 javascript实现

    1 2 3 4  5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9  如图所示,就是一个5*5的螺旋矩阵 我的思路如下: 第一步:拆分 ...

  4. API Gateway - KONG 安装与配置

    简介 Kong,是由Mashape公司开源的,基于Nginx的API gateway 特点 可扩展,支持分布式 模块化 功能:授权.日志.ip限制.限流.api 统计分析(存在商业插件Galileo等 ...

  5. ps的快捷键

    最近学习了一些ps切图,总结一些快捷键,以免自己忘记,总结的不好,也可能不全,忘大牛指点,试着坚持总结 1.工具箱 (多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取) 矩形.椭圆选框工具 ...

  6. Material04 MdListModule模块

    1 在共享模块中导入MdListModule模块 import { NgModule } from '@angular/core'; import { CommonModule } from '@an ...

  7. Linux高性能server编程——信号及应用

     信号 信号是由用户.系统或者进程发送给目标进程的信息.以通知目标进程某个状态的改变或系统异常. Linux信号可由例如以下条件产生: 对于前台进程.用户能够通过输入特殊的终端字符来给它发送信号. ...

  8. 一行代码搞定ThoughtWorks面试题

    今天在微博看到一道有趣的题目.作为python的脑残粉,自然手痒. 题目在这里. FizzBuzzWhizz 你是一名体育老师.在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课 ...

  9. Linux基础:xargs命令

    简介 xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有: 命令组合:尤其是一些命令不支持管道输入,比如ls. 避免参数过长:xargs可以通过-nx来将参数分组,避免 ...

  10. Web API的CORS

      Web API中进行跨域需要在请求头中加入允许跨域请求 Access-Control-Allow-Origin=* 上面代码代表允许所有跨域请求.当然也可以只允许某个站点进行跨域请求,只需将'*' ...