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. javascript文档节点

    创建文本节点 document.createTextNode() 创建新文本节点,该方法接收一个参数,即要插入节点中的文本信息. <script> //创建一个div节点 var elem ...

  2. ##6.2 Neutron计算节点-- openstack pike

    ##6.2 Neutron计算节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##6.2 Neutron计算节 ...

  3. python 生成html文件(表格)

    import pandas as pd def convert_to_html(result,title): d = {} index = 0 for t in title: d[] = result ...

  4. constructor 属性,判断是否为数组

    <!--你可以使用 constructor 属性来查看是对象是否为数组 (包含字符串 "Array"):--><p>constructor属性返回变量或对象 ...

  5. calc() ---一个会计算的css属性

    最近这个月一直在赶项目开发,遇到的问题和学到的前端知识没有更新到博客园,现在闲了下来,就整理一下前端知识. 在项目开发中,在样式这方面花费的时间较多,因为针对于数字的变化特别多,本人不爱记数字,在看设 ...

  6. TCP程序中发送和接收数据

    这里我们来探讨一下在网络编程过程中,有关read/write 或者send/recv的使用细节.这里有关常用的阻塞/非阻塞的解释在网上有很多很好的例子,这里就不说了,还有errno ==EAGAIN ...

  7. db2服务器端授权

    昨天吃饭回来有点晚,没有及时写,今天补上.            db2服务器端安装就不说了,网上很多.今天具体说说授权吧.这是个麻烦事.            安装的时候会让你创建数据库.你就根据提 ...

  8. Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. 来腾讯云开发者实验室 学习.NET Core 2.0

    腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力: 零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果: 在线 WEB IDE 支持 sh ...

  10. 关于前端框架BootStrap和JQueryUI(以及相应的优秀模板)

    近期两个月因为须要升级公司产品的界面.所以不得不去学习了下原本并不熟悉的前端框架. 这里也是推荐两款BootStrap和JQueryUI. bootstrap使用起始非常easy,首先.须要得到所须要 ...