Java知识荟萃(2019年4月18日)
纯洁的微笑
SpringBoot中自定义异常处理
在SpringBoot中自定义error页面有两种,一种是静态页面,一种是动态页面.
1.静态异常页面
- 使用HTTP响应码来命名页面,如404.html、405.html
- 直接定义4xx.html,表示400-499的状态都显示改页面
默认在classpath:/static/error/
下定义页面:
此时如果项目抛出500就会自动展示500.html页面,如果500.html和5xx.html页面都存在,发生500异常时,优先展示500.html页面.
2.动态异常页面
动态页面可以直接展示异常的详细信息,直接定义4xx.html或500.html即可,一般来说我们使用模板来实现(jsp、freemarker、thymeleaf)
如页面定义:
页面内容:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>
Title
</title>
</head>
<body>
<h1> 5xx </h1>
<table border="1">
<tbody>
<tr>
<td> path </td>
<td th:text="${path}"></td>
</tr>
<tr>
<td> error </td>
<td th:text="${error}"></td>
</tr>
<tr>
<td> message </td>
<td th:text="${message}"></td>
</tr>
<tr>
<td> timestamp </td>
<td th:text="${timestamp}"></td>
</tr>
<tr>
<td> status </td>
<td th:text="${status}"></td>
</tr>
</tbody>
</table>
</body>
</html>
效果:
如果静态页面和动态页面都存在,默认使用动态页面.即:发生了500错误–>查找动态 500.html 页面–>查找静态 500.html --> 查找动态 5xx.html–>查找静态 5xx.html。
3.自定义异常数据
SpringBoot默认展示的异常信息来自org.springframework.boot.web.reactive.error.DefaultErrorAttributes
的getErrorAttributes
方法中.
如果我们要自定义错误信息有两种方式:
- 直接实现ErrorAttributes接口
- 继承DefaultErrorAttributes.(推荐使用,因为改类中对异常的处理已经完成,可以直接使用)
注意定义好的ErrorAttribute要注册到容器中,这样就不会使用默认的DefaultErrorAttributes.
石彬的架构笔记
Unix和Java的IO模型
同步和异步
同步:调用一个接口,调用者必须等待这个接口的磁盘读写或者网络通信的操作执行完毕了,调用者才能返回.
异步:调用接口后,直接就返回了,调用者可以去执行别的逻辑,不用管那个接口的磁盘读写或者网络通信是否成功;然后接口后续完成了任务以后,会反过来通知调用者调用成功.可以通过一些内部通信机制来通知,也可以通过回调函数来通知.
阻塞和非阻塞
阻塞和非阻塞是针对底层IO操作来说的.
阻塞IO:发起请求到操作系统内核去从网络中读取数据,就会阻塞在哪里,必须要等待网络中的数据到达了以后,才能从网络读取数据到内核,再返回给程序.
非阻塞IO:程序发送请求给内核要从网络读取数据,但是此时网络中的数据还没到,此时不会阻塞住,内核会返回一个异常消息给程序.程序可以执行别的逻辑,过一会再发起一次请求给内核,让内核尝试从网络获取数据.需要程序不断轮询内核去读取数据,但是不会阻塞住程序.
同步/异步更多的是针对接口调用,服务调用,API类库调用.
阻塞/非阻塞针对的是底层IO操作的场景,如磁盘IO,网络IO.
Unix支持的5种IO模型
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 信号驱动式IO
- 异步IO