[编织消息框架][JAVA核心技术]异常应用

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核心技术]异常应用的更多相关文章
- [编织消息框架][JAVA核心技术]异常基础
Java异常体系结构 Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常. 其中异常类Exception又分为运行时异常(RuntimeExcept ...
- [编织消息框架][JAVA核心技术]动态代理应用4
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][JAVA核心技术]annotation基础
应用动态代理技术要先掌握annotation技术 注解是JDK1.5之后才有的新特性,JDK1.5之后内部提供的三个注解 @Deprecated 意思是“废弃的,过时的” @Override 意思是“ ...
- [编织消息框架][JAVA核心技术]动态代理应用12-总结
动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预 ...
- [编织消息框架][JAVA核心技术]数值与逻辑分离
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...
- [编织消息框架][JAVA核心技术]动态代理应用4-annotationProcessor
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][JAVA核心技术]jdk动态代理
需要用到的工具 jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.Invocation ...
- [编织消息框架][JAVA核心技术]动态代理应用2
接下来如何实现 第一步:先把服务类,调用方法转换成数字,方便传输 第二步:提取元信息,提取又有三种方式,三种各有优点,最优方式是第一种 1.编译java时处理 2.程序启动时处理,预处理 3.调用时处 ...
- [编织消息框架][JAVA核心技术]动态代理应用5-javassist
基础部份: 修改class我们用到javassist,在pom.xml添加 <properties> <javassist.version>3.18.2-GA</java ...
随机推荐
- Nginx负载均衡使用ip
upstream test1{ server 192.168.1.213; server 192.168.1.37; } server { listen 80; # default backlog=2 ...
- 05.haproxy+mysql负载均衡 整合 redis集群+ssm
本篇重点讲解haproxy+mysql负载均衡,搭建完成后与之前搭建的redis+ssm进行整合 (注:这里用到了两台mysql数据库,分别安装两台虚拟机上,已经成功实现主主复制,如果有需要,请查看我 ...
- vue.js介绍,常用指令,事件,以及制作简易留言版
一.vue是什么? 一个mvvm框架(库).和angular类似,比较容易上手.小巧,让我们的代码更加专注于业务逻辑,而不是去关注DOM操作 二.vue和angular之间的区别 vue--简单易学 ...
- zeppelin0.7.3源码编译
操作系统: Centos7.X Python版本: Python2.7 Maven版本:3.1.* Git:1.8.3.* JAVA:java1.7+ node npm bower grunt 每次执 ...
- 【Java入门提高篇】Day8 Java内部类——匿名内部类
今天来看看另一个更加神奇的类--匿名内部类. 就像它的名字表示的那样,这个类是匿名的,用完之后,深藏功与名,就像扫地僧那样默默潜藏于深山之中.匿名内部类不仅没有名字,连class关键字都省掉了,而且匿 ...
- day6、Linux下如何找出7天以前的文件删除
有些时候,由于系统产生的日志文件,使服务器的磁盘空间紧张,所以怎么删除7天以前的日志文件及让系统只保留7天以内的日志文件 方法一 使用命令:find + |xargs + ls 命令方法:find / ...
- Object-Relational Structural Patterns
Single Table Inheritance Represents an inheritance hierarchy of classes as a single table that has c ...
- String内存溢出异常(错误)可能的原因及解决方式
摘要:本Blog主要为了阐述java.lang.OutOfMemoryError:PermGenspace可能产生的原因及解决方式. 当中PermGen space是Permanent Generat ...
- 虚拟数据库_json_ajax
html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- flask 上传文件
flask upload 近日在学习python,接触到了flask框架,刚好客户有个需求,需要在网页上传一个python 代码的zip包,然后使用docker 容器运行这个zip里面的程序,输出结果 ...